1

我正在使用 expressjs 和 express-session 与 nodejs 中的 redis-connect 存储实现基于会话的服务,并且我对会话存储的并发修改有问题。查找以下问题示例:

  • 发布了两条路线:/api/op1 和 /api/op2
  • /api/op1:增加request.session.op1Calls的值并调用外部服务(3秒)
  • /api/op2:增加 request.session.op2Calls 的值,什么都不做(0.1 ms 执行)

这里的问题是:如果我在执行 op1 的过程中多次执行 op2,那么 request.session.op2Calls 的值就丢失了。我应该如何实现会话存储以永不丢失值?

谢谢!

4

1 回答 1

0

request.session发出请求时,正在从商店(在您的情况下为 redis 商店)读取Express 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 } )
           } );
       } );
   } );    
} );

这样,您将确保在保存之前重新读取会话。

于 2018-12-08T20:20:48.680 回答