node.js - Express-session - session 的并发修改

标签 node.js express session concurrency session-store

我正在使用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/

相关文章:

javascript - 优化结果页优先查询结果条数

node.js - 带有base64摘要算法的nodejs md5错误结果

javascript - npm install 找不到模块 'semver'

Node.js + Express.js。 Google 向我展示了服务器端翻译 ID

node.js - Unresolved 函数或方法应用程序 | Node .js

java - 检测 Portlet session 关闭

javascript - 使用 Node.js 和 MongoDB 存储密码

javascript - 回调、错误捕获和 MongoDB 的问题

php - 同一浏览器中的多个用户 session

javascript - 是否可以在 PHP 中进行异步调用而不刷新 session ?