我有一個node.js web應用程序,可在MongoDB和Sequelize(PostgreSQL)之間進行會話切換。對於這兩者,我也在連接閃光(也嘗試快速閃光)中間件的閃光消息層。總之,MongoDB的工作,Sequelize沒有。不支持connect-session-sequelize的Flash消息
該應用程序具有用戶可以編輯的「包」的概念。在用戶成功編輯包後,我設置了一條閃光消息:
"${timestamp} Package ${pkgID} successfully updated."
和重定向。使用Sequelize(connect-session-sequelize),即使我可以在數據庫中看到它,也不會顯示該Flash消息,並且如果我刷新該頁面,則會出現確實。
這裏是Sequelize會話設置:
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());
縱觀連接會話,sequelize源代碼,我發現,我可以添加「連接:會話sequelize」我的DEBUG環境變量來獲得額外的信息在控制檯中。以下是控制檯日誌中有趣的部分,其中包括一些格式,一些空白行和數字。
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
需要注意的是,在(1),更新完成,並在「數據」的更新,「閃」包含的對象:
"flash":{"flashSuccess":["{02/20/2017 10:53:49} Package 58a718a0280081343eeab6d9 was successfully updated."]}
這就是我的提示信息。但是,請注意,在(2),連接會話,sequelize調試吐出來表明它發現會話找到的消息,並在其中顯示了會話對象,閃光燈空:只是在這之後
"flash":{}
在(3)處,我的代碼嘗試檢索「flashSuccess」flash消息,但是它出現了一個空數組。但隨後,在(4),連接會話,sequelize吐出另一個FOUND調試信息,並在它這其中有閃光燈消息:
"flash":{"flashSuccess":["{02/20/2017 10:53:49} Package 58a718a0280081343eeab6d9 was successfully updated."]}
,如果我檢查數據庫,它就在那裏。
這幾乎就像設置Flash消息的UPDATE異步發生,並且在(2)處檢索到會話時還沒有完成,但隨後出現。但是我試着在設置flash消息後拋出一個setTimeout(),但無濟於事。
任何想法這裏發生了什麼?
更新:我添加了第三個會話存儲選項,它使用connect-pg-simple中間件將會話存儲在PostgreSQL中。使用該選項,Flash消息就可以正常工作。 connect-session-sequelize似乎是一個奇怪的人。