节点会话没有正确保存

我在节点会话中看到一些非常奇怪的事情。 我正在使用express-session和connect-mongo保存会话。

我的会话设置如下(所有请求都通过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 } })); 

我有一个使用节点canvas创build图像的path:

 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()的callback函数,因为当我知道会话已被编辑和保存时,我只想回应请求。

但是,这并不总是工作。 如果我在会话中设置颜色,然后清除它们(通过调用“api / clear”path),然后调用路由来创build图像(通过调用“api / canvas”path),“api / canvas “路线会话有时仍然有颜色设置。

只有我迅速做到这一点,情况似乎就是这样。 如果等待几秒钟,那么“api / canvas”路线的颜色将被清除。

注意:我不允许在同一时间调用这些路由 – 我使用承诺,并在用户界面中有一个微调,覆盖整个屏幕,直到请求完全完成。

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

 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%的时间。 剩下的时间,在第二个请求颜色属性已被删除。

什么可能会出错? 我误解了会议如何工作?

编辑

这变得更奇怪。 如果我将这些调用链接到UI中,那就叫做'api / clear'path,然后在Promise then()方法中,调用'api / canvas'path,它总是起作用。 如果我打电话来单独提出请求,结果是完全随机的 – 有时会话会更新,有时不会。

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

编辑使用regenerate方法工作正常,但不是理想的,因为我失去了会议中的一切。

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

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

如果完成对象的引用,那么删除对象的引用会非常有用,因为这会为垃圾回收器提供有关可回收内容的更多信息。 如果引用保留在一个大的对象上,这可能导致它不被回收,即使程序的其余部分实际上并没有使用该对象。

参考: http : //jennifermann.ghost.io/deleting-objects-in-javascript/

希望这可以帮助。