Express JS路由器中间件抽象

时间:2016-10-26 11:53:20

标签: node.js express middleware

我使用Node.js + Express JS开发了一个API,我使用基于令牌的身份验证。

我在这个api,userRoute(/ USER)和postRoute(/ POST)中使用了两个不同的路由器。 postRoute可以在身份验证中使用,但userRoute需要令牌。

要解决这个问题,我为userRoute使用路由器中间件,但它干扰了portRoute

这是代码:

...

var postRoute = express.Router();
var userRoute = express.Router();


// Route middleware to verify a token
userRoute.use(function(req, res, next) {
    security.checkToken(req,res, next);
});


userRoute.route('/users') 
    .get(userCtrl.findAllUsers)
    .post(userCtrl.addUser);


postRoute.route('/posts') 
    .get(userCtrl.findAllPosts)
    .post(userCtrl.addPost);


app.use(userRoute);
app.use(postRoute);

...

如果我尝试访问'/ posts',服务器会检查令牌并且不允许我进入。我知道如果我更改了app.use的顺序它可以工作,但我不明白为什么这样工作如果我是使用“路由器中间件”。

有人知道吗?

1 个答案:

答案 0 :(得分:1)

这是因为如果快速路由器实现,如果您查看它,您将能够非常容易地理解它。这是路径:node_modules/express/lib/router/index.js。每次调用Router()时,就像你的情况一样

var postRoute = express.Router();
var userRoute = express.Router();

将调用此函数:

var proto = module.exports = function(options) { ... }

确实每次都返回一个不同的路由器实例。不同之处在于use正在注册中间件的方式。如您所见,use已针对proto.use

进行了注册
proto.use = function use(fn) { ... }

这意味着您在那里注册的中间件将为您定义的路由器的每个实例注册。