如何将数据从 express 中间件直接传递回客户端 JWT 和 Express 中间件
Posted
技术标签:
【中文标题】如何将数据从 express 中间件直接传递回客户端 JWT 和 Express 中间件【英文标题】:How to Pass data from express middleware directly back to client JWT and Express middleware 【发布时间】: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即可。要将其作为正文的一部分发送,路由需要合作。
【参考方案1】:
我的问题的解决方案是通过这样的标头传递令牌。我无法查看令牌客户端,因为我没有公开标头(第 2 行)。
res.set('x-token', token);
res.set('Access-Control-Expose-Headers', 'x-token');
【讨论】:
以上是关于如何将数据从 express 中间件直接传递回客户端 JWT 和 Express 中间件的主要内容,如果未能解决你的问题,请参考以下文章
如何使用express [重复]在nodejs中将对象从服务器端传递到客户端