NodeJS后端在并发请求上混合了会话数据

时间:2019-09-16 14:41:40

标签: node.js express session passport.js tedious

我已经用Node js开发了一个多用户Web应用程序。 我使用ExpresJS作为框架,还使用PassportJS管理身份验证和用户会话。

一切正常,但是当两个或多个用户并发请求时,存在一个大问题:

后端正在混合请求并向客户端返回错误的响应,以便他们可以获取其他用户的信息。

我不知道发生了什么,我的痛苦非常大。我的护照序列化/反序列化代码(我正在使用SQL Server数据库和mssql进行连接):

passport.serializeUser((user, done)=>{
    done(null, user.Id)
})

passport.deserializeUser((id, done)=>{
    params = []
    db.buildParams(params,"Id", TYPES.Int, id)
    db.procedure("FindUserById", params, (rows)=>{
        console.log(rows[0])
        done(null, rows[0])
    })
})

我的应用配置:

const app = express()
app.use(session({
    secret: 'supersecretpwd',
    resave: false,
    saveUninitialized: false,
    secure: true,
    httpOnly: true,
    expires: expiryDate
}))
app.use(flash());
app.use(passport.initialize());
app.use(passport.session());
app.use(validator());
app.use((req, res, next) => {
    app.locals.message = req.flash('message')
    app.locals.success = req.flash('success')
    app.locals.user = req.user
    next();
  });

我真的不知道应该提供更多的代码,但是我可以提供更多的实现细节。

2 个答案:

答案 0 :(得分:0)

我刚刚换了

app.locals.user = req.user

收件人:

res.locals.user = req.user

并发问题消失了。

我希望任何人都可以解释为什么这样做有效,以便阐明更好的答案。

答案 1 :(得分:0)

威廉姆斯, 我有同样的问题,我发现这个有用的回复可以澄清我们的疑虑:

“您可以将 app.locals 视为全局的。您可能希望在 app.locals 中存储的一些示例:URL 帮助程序、应用程序级常量。您应该将任何您希望在每个视图中都可以访问的内容放在这里。

res.locals 仅存储特定响应(响应特定请求)的数据。例如,GET /something 将创建一个新的 res.locals,它通过所有响应“/something”的中间件传递。此处的适当信息是您的问题中经过身份验证的用户详细信息。

生命周期看起来像这样,其中您的职责很大胆(其他一切都由 express 为您完成):

  • 应用已创建 (var app = express();)
  • app.locals 已创建
  • 请求到达
  • res.locals 是为该请求创建的
  • 您向 res.locals 添加诸如用户角色之类的内容 (res.locals.role = 'admin';)
  • 您提供对请求的响应 (res.render('some/view');)
  • 该请求的 res.locals 被垃圾收集,消失了
  • app.locals 只要应用存在就一直存在 "

我知道这是几个月前的事,但它可以帮助其他人