gpt4 book ai didi

node.js - Flash 消息不适用于 connect-session-sequelize

转载 作者:行者123 更新时间:2023-12-03 22:23:51 24 4
gpt4 key购买 nike

我有一个 node.js Web 应用程序,它可以在 MongoDB 和 Sequelize (PostgreSQL) 之间切换以进行 session 。对于这两种情况,我还在连接闪存(也尝试过 express-flash)中间件中分层以用于闪存消息。简而言之,MongoDB 有效,Sequelize 无效。

该应用程序具有用户可以编辑的“包”概念。用户编辑包成功后,我设置了一个flash message

"${timestamp} Package ${pkgID} successfully updated." 

和重定向。使用 Sequelize (connect-session-sequelize),即使我可以在数据库中看到它,也不会显示 Flash 消息,如果我刷新页面,它就会出现。

这是 Sequelize session 的设置:
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-session-sequelize 源代码,我发现我可以将“connect:session-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)处,完成了 UPDATE,并且在更新的“数据”中,“flash”包含一个对象:
"flash":{"flashSuccess":["{02/20/2017 10:53:49} Package 58a718a0280081343eeab6d9 was successfully updated."]}

那是我的闪光信息。但是,请注意 (2),connect-session-sequelize debug 会吐出一条 FOUND 消息,显示它找到的 session ,并且在它显示的 session 对象中,flash 为空:
"flash":{}

紧接着,在 (3) 处,我的代码尝试检索“flashSuccess” flash 消息,但它出现了一个空数组。但是,在 (4) 处,connect-session-sequelize 会吐出另一条 FOUND 调试消息,其中包含 flash 消息:
"flash":{"flashSuccess":["{02/20/2017 10:53:49} Package 58a718a0280081343eeab6d9 was successfully updated."]}

如果我检查数据库,它就在那里。

就好像设置 flash 消息的 UPDATE 是异步发生的,并且在 (2) 处检索 session 时尚未完成,但稍后它会显示出来。但是我尝试在设置 flash 消息后抛出 setTimeout() ,但无济于事。

任何想法这里发生了什么?

更新:我添加了第三个 session 存储选项,它使用 connect-pg-simple 中间件在 PostgreSQL 中存储 session 。使用该选项,Flash 消息可以正常工作。 connect-session-sequelize 似乎是个奇怪的人。

最佳答案

在这里回答我自己的问题,但在 issues board for connect-session-sequelize 上指出 express-session 在这些 flash 消息场景中存在竞争条件,并且需要在设置 flash 消息后调用 req.session.save(cb),返回响应回调,以避免这种情况。例如:

req.flash('flashError', err.message);
req.session.save(function() {
res.redirect('/packages');
});

这样做解决了问题。

关于node.js - Flash 消息不适用于 connect-session-sequelize,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42349941/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com