【发布时间】:2021-09-06 12:37:03
【问题描述】:
我目前被困在尝试使用 express 中间件、react 和 JWT 实现刷新令牌。我遇到的问题是我需要将刷新的令牌从中间件函数传递回客户端。我尝试使用 res.locals.variableName 和 res.set,但是一旦中间件函数完成并调用 next(),我会在我的路由中使用 res.json 进行响应,我认为这会覆盖我在来自中间件的响应。如何在仍然能够调用 next() 的同时将此刷新令牌返回到客户端?
app.all('*', function (req, res, next) {
const headerToken = req.headers.token;
const refreshToken = req.headers.refreshtoken;
const isVerifiedPath = verifyPaths(unauthorizedPaths, currentPath);
if (isVerifiedPath) {
next()
}
else {
jwt.verify(headerToken, process.env.KEY, async (err, data) => {
if (err) {
if (err.expiredAt) { // expired web token
jwt.verify(refreshToken, process.env.KEY, async (err, data) => {
if (data) {
const User = require('./models/User');
const user = await User.query().findById(data.user.id);
const token = jwt.sign({ user }, process.env.KEY, { expiresIn: 5 });
req.user = user;
res.locals.varName = token; // I would like this to be accessible from the response my api returns
next();
}
})
}
else {
return res.status(401).json({ err: 401 });
}
}
else {
req.user = data.user;
next();
}
});
}
});
【问题讨论】:
-
您希望如何访问
res.locals.varName?您的路线如何使用res.locals,那里会覆盖什么? -
在 res.set 或 res.locals.varName 设置之后,如果我 console.log(res) 它就在那里。在 next() 之后调用的路由中也是如此。但是,在 next() 之后调用的路由中,我返回 res.json(random stuff) 并且我希望响应包含 refreshToken 并且可以从客户端访问。问题是它一旦返回客户端就不存在了。我假设它被 res.json() 覆盖,会是这样吗? @Bergi
-
您希望它如何发送给客户?作为头条?作为身体的一部分?
res.locals通常与视图引擎一起使用,而不是原始 json 响应。 -
啊,我不知道。但是是的,我想成为正文或标题的一部分,而不是将其包含在 next() 之后调用的路由中。我有很多路由,所以理想情况下,如果可能的话,我希望它从中间件函数附加到响应对象。 @Bergi
-
如果你想作为header发送,只需从中间件发送header即可。要将其作为正文的一部分发送,路由需要合作。
标签: javascript node.js express jwt middleware