【问题标题】:Is there a way to set middleware in express (node.js) to have specific values return in every route?有没有办法在 express (node.js) 中设置中间件以在每条路由中返回特定值?
【发布时间】:2015-05-14 00:47:59
【问题描述】:

我具体提到的情况涉及到使用 json web token (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;
};

如何使用 express 中间件来防止这种重复?

【问题讨论】:

    标签: json node.js express


    【解决方案1】:

    您可以使用“中间件”执行此操作的唯一方法是在中间件链的末端设置一个处理程序来发送响应。这意味着您的所有处理程序都必须将请求和响应沿链传递。它本质上是 404 处理程序之前的最后一个处理程序。我不建议这样做。或者,您可以为您的 express 应用创建自定义响应方法。

    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);
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-29
      • 1970-01-01
      • 2012-03-17
      • 2012-02-15
      • 2013-01-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多