在任何路由之前运行的中间件

middleware that run before any routes

本文关键字:运行 中间件 任何 路由      更新时间:2023-09-26

我正在尝试进行基于令牌的身份验证。我一直忙于在任何请求发生之前运行auth。例如,下面的代码是获取用户,但一个中间件应该检查请求是否具有有效的令牌。

app.js

var user = require('./controllers/user');
app.use('/api', user);

user.js

var express = require('express');
var router = express.Router(); 
router.get('/user', function(req, res) {
  User.find({}, function(err, users) {
    res.json(users);
  });
});
module.exports = router;

我有这个逻辑,但我不知道该放在哪里。

在您的app.js中,在任何路由之前,使用express‘app.use()注册令牌身份验证中间件。

这样,每次调用之后定义的路由时,都会执行令牌身份验证。基本上,app.use(身份验证)与app.use相同('*',身份验证),这意味着中间件是针对所有域执行的,而不仅仅是针对'/api'。

auth.js

module.exports = function(req, res, next) {
    // check header or url parameters or post parameters for token
    var token = req.body.token || req.param('token') || req.headers['x-access-token'];
    // decode token
    if (token) {
        // verifies secret and checks exp
        jwt.verify(token, app.get('superSecret'), function(err, decoded) {          
            if (err) {
                return res.json({ success: false, message: 'Failed to authenticate token.' });      
            } else {
                // if everything is good, save to request for use in other routes
                req.decoded = decoded;  
                next();
            }
        });
    } else {
        // if there is no token
        // return an error
        return res.status(403).send({ 
            success: false, 
            message: 'No token provided.'
        });
    }
};

app.js

var express = require("express");
var app = module.exports = express();
// put the middleware before any routes in app.use()
var authentication = require("./middleware/auth");
app.use(authentication);
var user = require('./controllers/user');
app.use('/api', user);

如果你想只对"/api"路由进行令牌检查,那么就用为其定义身份验证

app.use('/api', authentication, user);

use()按照给定的顺序运行作为参数给定的函数。

把中间件放在一切之前:)

var app = express();
function myCustomMiddleware(req, res, next) {
  if(/**something we need **/) {
    req.haveWhatWeNeed = true;
  }
  
  return next();
}
app
.use(myCustomMiddleware)
.get(/*** everything you want***/)
;

您可以在定义任何路由之前定义中间件,以确保它们在被路由处理之前得到执行。

我从您的问题中了解到,在执行路由代码之前,您需要进行中间件检查。

    var middlewareFunction = function(req, res, next) {
        // check header or url parameters or post parameters for token
        var token = req.body.token || req.param('token') || req.headers['x-access-token'];
        // decode token
        if (token) {
            // verifies secret and checks exp
            jwt.verify(token, app.get('superSecret'), function(err, decoded) {          
                if (err) {
                    return res.json({ success: false, message: 'Failed to authenticate token.' });      
                } else {
                    // if everything is good, save to request for use in other routes
                    req.decoded = decoded;  
                    next();
                }
            });
        } else {
            // if there is no token
            // return an error
            return res.status(403).send({ 
                success: false, 
                message: 'No token provided.'
            });
        }
}

制作一个中间件函数,并在您的路由中添加此函数。。

var express = require('express');
var router = express.Router(); 
router.get('/user', middlewareFunction, function(req, res, next) {
  User.find({}, function(err, users) {
    res.json(users);
  });
});
module.exports = router;

我希望这能解决你的问题。