我正在使用expressjs和express-session以及nodejs中的redis-connect存储来实现基于 session 的服务,并且我在 session 存储上的并发修改方面遇到了问题。查找以下问题示例:
- 已发布两条路由:/api/op1 和/api/op2
- /api/op1:增加 request.session.op1Calls 的值并执行对外部服务的调用(3 秒)
- /api/op2:增加 request.session.op2Calls 的值,并且不执行任何操作(执行 0.1 毫秒)
这里的问题是:如果我在op1执行期间多次执行op2,request.session.op2Calls值就会丢失。我应该如何实现 session 存储才不会丢失值?
谢谢!
最佳答案
在发出请求时,正在从存储(在您的情况下是 redis 存储)中读取 Express session (request.session
)。
让请求执行任务,然后修改 session 并将其保存回存储区,实际上会保存已读取的 session ,并用更新的属性进行丰富。
为了缓解这种情况,您可以在保存之前重新加载 session :
app.get( "/op2", function( req, res, next ) {
someReallyLongAsyncTask( function() {
req.session.reload(function(err) {
if ( !req.session.op2Call ) { req.session.op2Call = 0; }
req.session.op2Call++;
req.session.save( function() {
res.json( { success: true } )
} );
} );
} );
} );
这样您就可以确保在保存 session 之前重新读取 session 。
关于node.js - Express-session - session 的并发修改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53686349/