【问题标题】:NodeJS backend is mixing up session data on concurrent requestsNodeJS 后端正在混合并发请求的会话数据
【发布时间】:2021-03-24 00:13:35
【问题描述】:

我使用 Node js 开发了一个多用户 Web 应用程序。 我使用 ExpressJS 作为框架,还使用 ​​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();
  });

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

【问题讨论】:

  • 你是如何声明变量的?使用var?
  • 是的,我检查了一切,没有一个全局变量

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


【解决方案1】:

我刚刚换了

app.locals.user = req.user

到:

res.locals.user = req.user

并发问题消失了。

我希望任何人都可以解释为什么这样做,以便详细说明一个更好的答案。

【讨论】:

  • 发生这种情况是因为 app.locals 是为每个请求-响应共享的。同时 res.locals 只存在于每个请求-响应的上下文中。
【解决方案2】:

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

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

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

生命周期看起来像这样,你的职责是大胆的(其他一切都由快递为你完成):

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

我知道那是几个月前的事了,但它可以帮助别人

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-26
    • 1970-01-01
    • 2019-03-02
    相关资源
    最近更新 更多