我已经用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();
});
我真的不知道应该提供更多的代码,但是我可以提供更多的实现细节。
答案 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 为您完成):
我知道这是几个月前的事,但它可以帮助其他人