セッション用にMongoDBとSequelize(PostgreSQL)の間で切り替え可能なnode.js Webアプリケーションがあります。両方のために、私はフラッシュ・メッセージのためにconnect-flash(また、エクスプレス・フラッシュを試したミドルウェア)をレイヤーします。要するに、MongoDBは動作しますが、Sequelizeは動作しません。フラッシュメッセージがconnect-session-sequelizeで動作しない
アプリには、ユーザーが編集できる「パッケージ」という概念があります。ユーザーがパッケージを正常に編集した後、
"${timestamp} Package ${pkgID} successfully updated."
のフラッシュメッセージを設定してリダイレクトします。 Sequelize(connect-session-sequelize)を使用すると、フラッシュメッセージはデータベースに表示されても表示されず、ページを更新するとにはが表示されます。ここで
がSequelizeセッションのセットアップです:私のDEBUG環境変数に余分に取得する:
var cookieParser = require('cookie-parser');
var expSession = require('express-session');
var flash = require('express-flash');
app.use(cookieParser(process.env.COOKIE_SECRET));
if (sessionDBVendor === 'postgres') {
let models = require('./models/postgres');
var SequelizeSessionStore = require('connect-session-sequelize')(expSession.Store);
var sequelizeSessionStore = new SequelizeSessionStore({
db: models.sequelize,
table: 'Session'
});
sequelizeSessionStore.on('set', function (data) {
debug(`SequelizeSessionStore: Session ${data} UPDATED.`);
});
app.use(
expSession({
secret: process.env.COOKIE_SECRET,
store: sequelizeSessionStore,
resave: false, // we support the touch method so per the express-session docs this should be set to false
proxy: false, // if you do SSL outside of node.
saveUninitialized: false,
})
);
}
app.use(flash());
は、connect-セッションsequelizeのソースコードを見ると、私は、「セッション・sequelizeを接続する」を追加できることが分かっ情報をコンソールに表示します。ここにコンソールログの興味深い部分があります。いくつかの書式と、いくつかの空白行と、数字が追加されています。 (1)、UPDATEが行われている時に、更新のための "データ" で、 "フラッシュ" は、オブジェクトが含まれていることを
connect:session-sequelize INSERT "DnVIEQiTfaxKZjYgC7uHmKbelJvJBzrI" +5s
Executing (default): SELECT "sid", "userId", "expires", "data", "createdAt", "updatedAt"
FROM "webjmp"."sessions" AS "Session"
WHERE "Session"."sid" = 'DnVIEQiTfaxKZjYgC7uHmKbelJvJBzrI';
connect:session-sequelize SELECT "DnVIEQiTfaxKZjYgC7uHmKbelJvJBzrI" +10ms
Executing (default): SELECT "sid", "userId", "expires", "data", "createdAt", "updatedAt"
FROM "webjmp"."sessions" AS "Session"
WHERE "Session"."sid" = 'DnVIEQiTfaxKZjYgC7uHmKbelJvJBzrI';
(1)
Executing (default): UPDATE "webjmp"."sessions" SET "expires"='2017-02-21 15:53:54.738 +00:00',
"data"='{"cookie":{"originalMaxAge":null,"expires":null,"httpOnly":true,"path":"/"},
"flash":{"flashSuccess":["{02/20/2017 10:53:49} Package 58a718a0280081343eeab6d9 was successfully updated."]}}',
"updatedAt"='2017-02-20 15:53:54.756 +00:00' WHERE "sid" = 'DnVIEQiTfaxKZjYgC7uHmKbelJvJBzrI'
(2)
connect:session-sequelize FOUND DnVIEQiTfaxKZjYgC7uHmKbelJvJBzrI with data
{"cookie":{"originalMaxAge":null,"expires":null,"httpOnly":true,"path":"/"},"flash":{}} +17ms
Executing (default): SELECT "Package"."_id", "Package"."title", "Package"."description",
{content removed for brevity}
FROM "webjmp"."packages" AS "Package"
{content removed for brevity}
ORDER BY "Package"."timestamp" DESC;
::1 - - [20/Feb/2017:15:53:54 +0000] "POST /packages/58a718a0280081343eeab6d9 HTTP/1.1" 302 62
packages ID of package in returned list: 58a718a0280081343eeab6d9 +166ms
packages ID of package in returned list: 58a716c35326d0b0380c0b37 +0ms
packages ID of package in returned list: 58a474c55c9f18cc31cb0e2a +0ms
packages ID of package in returned list: 58a45dfa51f335c015d8591f +0ms
packages ID of package in returned list: 589cc7f30a333d1864b07bb2 +0ms
(3)
packages listPackages: flashSuccess: [] +0ms
connect:session-sequelize TOUCH "DnVIEQiTfaxKZjYgC7uHmKbelJvJBzrI" +92ms
Executing (default): UPDATE "webjmp"."sessions" SET "expires"='2017-02-21 15:53:55.023 +00:00',
"updatedAt"='2017-02-20 15:53:55.024 +00:00'
WHERE "sid" = 'DnVIEQiTfaxKZjYgC7uHmKbelJvJBzrI'
::1 - - [20/Feb/2017:15:53:55 +0000] "GET /packages HTTP/1.1" 200 6909
connect:session-sequelize SELECT "DnVIEQiTfaxKZjYgC7uHmKbelJvJBzrI" +14ms
Executing (default): SELECT "sid", "userId", "expires", "data", "createdAt", "updatedAt"
FROM "webjmp"."sessions" AS "Session"
WHERE "Session"."sid" = 'DnVIEQiTfaxKZjYgC7uHmKbelJvJBzrI';
connect:session-sequelize SELECT "DnVIEQiTfaxKZjYgC7uHmKbelJvJBzrI" +6ms
Executing (default): SELECT "sid", "userId", "expires", "data", "createdAt", "updatedAt"
FROM "webjmp"."sessions" AS "Session" WHERE "Session"."sid" = 'DnVIEQiTfaxKZjYgC7uHmKbelJvJBzrI';
(4)
connect:session-sequelize FOUND DnVIEQiTfaxKZjYgC7uHmKbelJvJBzrI with data
{"cookie":{"originalMaxAge":null,"expires":null,"httpOnly":true,"path":"/"},
"flash":{"flashSuccess":["{02/20/2017 10:53:49} Package 58a718a0280081343eeab6d9 was successfully updated."]}} +3ms
注:
"flash":{"flashSuccess":["{02/20/2017 10:53:49} Package 58a718a0280081343eeab6d9 was successfully updated."]}
私のフラッシュメッセージです。ただし、ノートはで(2)、接続セッション-sequelizeのデバッグは、それが見つけたセッションを示すFOUNDメッセージを吐き出し、それが示しセッションオブジェクトに、フラッシュが空です:
"flash":{}
ちょうどその後、(3)、私のコードは "flashSuccess"フラッシュメッセージを取得しようとしますが、空の配列が表示されます。しかし、その後、(4)で、接続セッション-sequelizeは別FOUNDデバッグメッセージを吐き出し、この1は、その中にフラッシュメッセージがあります。
"flash":{"flashSuccess":["{02/20/2017 10:53:49} Package 58a718a0280081343eeab6d9 was successfully updated."]}
を、私はデータベースをチェックすると、そこにそれがあります。
フラッシュメッセージを設定しているUPDATEは非同期的に起こっていて、(2)でセッションが取得されるまでに完了していませんが、後で表示されます。しかし、フラッシュメッセージを設定した後にsetTimeout()をスローしてみましたが、無駄です。
ここで何が起こっているのですか?
UPDATE:私は、PostgreSQLにセッションを保存するためにconnect-pg-simpleミドルウェアを使用する3番目のセッション格納オプションを追加しました。このオプションでは、フラッシュメッセージはうまく動作します。 connect-session-sequelizeは奇妙な人であるようです。