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

时间:2017-01-28 23:27:56

标签: json node.js express

我正在尝试使用JWT构建无状态API。我的路由器中有一个中间件功能,用于检查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']}

找到一种方法会很好,我不必改变现有的所有代码并检查是否有新的令牌。

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

一种选择是在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方法的引用,然后在有条件地将令牌注入有效负载后调用它来完成的。

答案 1 :(得分:0)

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

而不是在中间件中编写令牌,而不是像

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

并在你的路线

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