我使用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的顺序它是有效的,但我不明白为什么这样工作如果我使用“路由器中间件”.
有人知道吗?
最佳答案 发生这种情况是因为如果快速路由器实现,如果您查看它,您将能够非常容易地理解它.这是路径:node_modules / express / lib / router / index.js.每次调用Router()时,就像你的情况一样
var postRoute = express.Router();
var userRoute = express.Router();
将调用此函数:
var proto = module.exports = function(options) { ... }
并且确实每次都返回一个不同的路由器实例.不同之处在于使用注册中间件的方式.正如您所看到的那样,它是针对proto.use注册的
proto.use = function use(fn) { ... }
这意味着您在那里注册的中间件将为您定义的路由器的每个实例注册.