Express JS路由器中间件抽象

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

我在这个API中使用了两个不同的路由器,userRoute(/ USER)和postRoute(/ POST)。 postRoute可以在authentication中使用,但是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); ... 

如果我尝试访问“/职位”的服务器检查令牌,不让我进来。我知道如果我改变了app.use它的工作顺序,但我不明白为什么这样工作,如果我使用“路由器中间件”。

有人知道吗?

发生这种情况的原因是,如果快速路由器的实现,你将能够很容易地理解,如果你看看它。 这里是path: node_modules/express/lib/router/index.js 。 每次你打电话给路由器(),就像你的情况

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

这个函数将被调用:

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

而且每次都有一个不同的路由器实例被返回。 区别在于use注册中间件的方式。 正如你看到的use它注册proto.use

 proto.use = function use(fn) { ... } 

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