有没有一种方法来设置中间件express(node.js)每个路由具有特定的值返回?

我特别提到的情况涉及使用jsonnetworking令牌(jwt)。 例如,如果该Web令牌过期而没有重复代码,我将如何自动添加中间件以仅返回新的json Web令牌? 下面的示例代码将显示我的意思。

var express = require("express"); var jwt = require('jsonwebtoken'); var router = express.Router(); router.use(function(req,res,next){ var token = req.body.token || req.query.token; if (token) { jwt.verify(token,"secretTingz",{algorithms:["RS256"]},function(err,decoded){ if (err) { if (token.expired) { // HOW DO I GET THIS PIECE OF CODE TO RUN FOR EVERY VALID ROUTE THAT NEEDS A NEW TOKEN WITHOUT DUPLICATING CODE? var token = jwt.sign({user:"MilnerJenkins"},cert,{algorithm:"RS256",expiresInMinutes:1}); req.token = token; next(); }else{ return res.json({message:"Failed to authenticate token"}); } }else{ req.decoded = decoded; next(); } }) }else{ return res.status(403).send({ message: "No token!" }); } }); apiRoutes.get("/stuff",function(req,res){ var token; if (req.token) { token = req.token; }; res.json({message: "Dope API son!",token:token}); }); apiRoutes.get("/users",function(req,res){ var token; if (req.token) { token = req.token; }; User.find({},function(err,users){ res.json({users: users, token: token}); }); }); 

正如你所看到的,这个代码块在这两个路由中都被复制了:

 var token; if (req.token) { token = req.token; }; 

我可以用快递中间件做什么来防止这种重复?

你可以用“中间件”来做到这一点,唯一的办法就是在你的中间件链的最后有一个处理程序来发送响应。 那将意味着你的所有处理者将不得不将请求和响应传递到链中。 它基本上是你的404处理程序之前的最后一个处理程序。 我不build议这样做。 或者,您可以为快速应用程序创build自定义响应方法。

 var app = require('express')(); app.response.myJsonRes = function(obj) { if (this.req.token) { obj.token = this.req.token; } this.json(obj); }; app.get('/myRoute', function(req, res) { // get data somehow res.myJsonRes(data); }); 

你甚至改变了标准的json方法。

 var prevJson = app.response.json; app.response.json = function(obj) { if (this.req.token) { obj.token = this.req.token; } prevJson.call(this, obj); };