gpt4 book ai didi

javascript - Node session 未正确保存

转载 作者:IT老高 更新时间:2023-10-28 13:30:23 29 4
gpt4 key购买 nike

我发现 Node session 有些奇怪。我正在使用 express-sessionconnect-mongo保存 session 。

我的 session 设置如下(所有请求都通过 https):

var session = require('express-session');
var MongoStore = require('connect-mongo/es5')(session);

var sess = {};

app.use(session({
secret: 'xxxx',
saveUninitialized: false,
store: new MongoStore({
mongooseConnection: mongoose.connection,
ttl: 60 * 30 // haf hour
}),
cookie: { secure: true }
}));

我有一条使用 Node Canvas 创建图像的路线:

app.get('/api/canvas', function(req, res) {

sess = req.session;

console.log('in canvas and sess is ', sess);

// create image stuff
});

在应用程序的其他位置,您可以设置背景颜色等内容。然后我有一条路线来清除这些:

app.get('/api/clear', function(req, res) {

sess = req.session;

if (sess.colors) {
delete sess.colors;
}

sess.save(function(err) {
console.log('saved sess is now ', sess);
// session saved
helper.sendJsonResponse(req, res, 200, {});
})
});

helper.sendJsonResponse() 只是响应 200 HTTP 代码和一个空的正文。

您可以看到我对 session.save() 使用了回调,因为我只想在知道 session 已被编辑和保存时响应请求。

但是,这并不总是有效。如果我在 session 中设置颜色,然后清除它们(通过调用'api/clear'路由),然后调用路由创建图像(通过调用'api/canvas'路由),'api/canvas'上的 session ' 路由 session 有时仍然设置颜色。

这似乎只有在我快速完成的情况下才会出现。如果我等待几秒钟,“api/canvas”路线的颜色就会被清除。

注意:我不允许同时调用这些路由 - 我使用 Promise 并在 UI 中有一个微调器,它覆盖整个屏幕,直到请求完全完成。

发生这种情况时,日志如下所示:

saved sess is now  { cookie: 
{ path: '/',
_expires: null,
originalMaxAge: null,
httpOnly: true },
canvasHeight: 500,
canvasWidth: 591
}

当我向“api/canvas”发出请求时:

in canvas and sess is  { cookie: 
{ path: '/',
_expires: null,
originalMaxAge: null,
httpOnly: true },
canvasHeight: 500,
canvasWidth: 591,
colors:
{
color1: 'red',
color2: 'green'
}
}

所以你可以看到,颜色属性仍然设置。这发生在大约 50% 的时间里。其余时间,在第二次请求时,colors 属性已被删除。

可能出了什么问题?我是否误解了 session 的工作原理?

编辑

这变得越来越奇怪。如果我在 UI 中链接调用,即所谓的“api/clear”路由,然后在 Promise then() 方法中,调用“api/canvas”路由,它总是有效的。如果我打电话单独提出请求,结果是完全随机的——有时 session 会更新,有时不会。

我检查了 req.sessionID 并且对于不同的请求它总是相同的。

编辑使用 regenerate method工作正常,但并不理想,因为我在 session 中丢失了所有内容。

最佳答案

delete 操作符只删除一个引用,而不是一个对象本身。如果它确实删除了对象本身,其他剩余的引用就会悬空,就像 C++ 删除一样。 (访问其中一个会导致崩溃。使它们都变为空意味着在删除每个对象时需要额外的工作或额外的内存。)

由于 Javascript 是垃圾收集,因此您不需要自己删除对象 - 当无法再引用它们时,它们将被删除。

如果您完成了对对象的引用,删除它们会很有用,因为这会为垃圾收集器提供更多关于可以回收的信息。如果对大对象的引用仍然存在,这可能会导致它未被回收 - 即使您的程序的其余部分实际上并未使用该对象。

引用: http://jennifermann.ghost.io/deleting-objects-in-javascript/

希望这会有所帮助。

关于javascript - Node session 未正确保存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41387948/

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