Express-session - 会话并发修改
Express-session - Concurrent modifications on session
我正在使用 expressjs 和 express-session 以及 nodejs 中的 redis-connect 存储实现基于会话的服务,我对会话存储的并发修改有疑问。查找以下问题示例:
- 已发布两条路线:/api/op1 和 /api/op2
- /api/op1:自增request.session.op1Calls的值并执行对外部服务的调用(3秒)
- /api/op2:增加request.session.op2Calls的值,什么也不做(0.1毫秒执行)
这里的问题是:如果我在op1的执行过程中多次执行op2,request.session.op2Calls的值就丢失了。我应该如何实现会话存储以永不丢失值?
谢谢!
在发出请求时,正在从商店(在您的例子中是 redis 商店)中读取 Express 会话(request.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 } )
} );
} );
} );
} );
这样您将确保会话在保存之前被重新读取。
我正在使用 expressjs 和 express-session 以及 nodejs 中的 redis-connect 存储实现基于会话的服务,我对会话存储的并发修改有疑问。查找以下问题示例:
- 已发布两条路线:/api/op1 和 /api/op2
- /api/op1:自增request.session.op1Calls的值并执行对外部服务的调用(3秒)
- /api/op2:增加request.session.op2Calls的值,什么也不做(0.1毫秒执行)
这里的问题是:如果我在op1的执行过程中多次执行op2,request.session.op2Calls的值就丢失了。我应该如何实现会话存储以永不丢失值?
谢谢!
在发出请求时,正在从商店(在您的例子中是 redis 商店)中读取 Express 会话(request.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 } )
} );
} );
} );
} );
这样您将确保会话在保存之前被重新读取。