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

时间:2015-12-06 13:08:13

标签: javascript node.js express npm

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

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;

我的逻辑是here,但我不知道放在哪里。

4 个答案:

答案 0 :(得分:0)

将中间件置于一切之前:)

var app = express();

function myCustomMiddleware(req, res, next) {
  if(/**something we need **/) {
    req.haveWhatWeNeed = true;
  }
  
  return next();
}

app
.use(myCustomMiddleware)
.get(/*** everything you want***/)
;

答案 1 :(得分:0)

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

答案 2 :(得分:0)

在你的app.js中注册令牌认证中间件,快递' app.use()之前任何路线。

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

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

app.use()以给定的顺序运行作为参数给出的函数。

答案 3 :(得分:0)

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

    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;

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