Express Multiple res.json(); 与中间件

我正在尝试使用JWT构build一个无状态的API。 我在我的路由器中有一个中间件function,它检查JWT是否已经过期,如果有的话,一个带有新时间戳的新令牌在飞行中产生。

我想传递新的标记以及JSON对象中的响应。 我目前的做法是这样的,但它当然不起作用:

router.use(function (req, res, next) { // JWT Expired // Generate new JWT res.write(JSON.stringify({token: token}); next(); }); router.get('/securedRoute' function(req, res) { // Fetch data res.json({data: data}); }); 

 // Output should be: {token: 'erg34jlkgjre.3f4fknlj.34f3', data: ['sdfa', 'sdf']} 

这将是很好的find一种方式,我不必改变我现有的所有代码,并检查是否有新的令牌。

谢谢你的帮助!

一种select是将权限令牌添加到response头中:

 router.use((request, response, next) => { response.setHeader('Token', token); next(); }); router.get('/securedRoute', (request, response) => { response.json({ data: data }); }); 

或者,您可以随时将令牌添加到request ,然后有条件地将request.token添加到所有路由中,如前面提供的答案。 不幸的是,这意味着你需要修改所有的路线。


作为替代方法,您可以重写response.json方法,并手动将标记(如果存在)注入。 这样做,你不需要修改你的任何路线。

 router.use((request, response, next) => { request.token = token; ((proxied) => { response.json = function (data) { if (request && request.token) { data.token = request.token; } return proxied.call(this, data); }; })(response.json); next(); }); router.get('/securedRoute', (request, response) => { response.json({ data: data }); }); 

在上面的例子中, response.json方法在中间件中被覆盖。 这是通过传递一个旧的response.json方法的引用,然后在有条件地将该令牌注入有效负载之后调用它来完成的。

答案是假设你想用同样的方法来实现

而不是在中间件中写入令牌就像做类似的事情

 (req,res,next)=>{ req.token = newToken; next(); } 

并在你的路线

 res.json(req.token ? {token:req.token,data:data} : {data:data});