Express JS 路由器中间件抽象
Express JS Router Middleware Abstraction
我使用 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 的顺序它会起作用,但我不明白为什么会这样如果我使用 "Router Middleware".
有人知道吗?
发生这种情况是因为如果使用 express router 实现,那么如果您看一下它,您将能够很容易地理解它。这是路径: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) { ... }
这意味着您在那里注册的中间件将为您定义的每个路由器实例注册它们。
我使用 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 的顺序它会起作用,但我不明白为什么会这样如果我使用 "Router Middleware".
有人知道吗?
发生这种情况是因为如果使用 express router 实现,那么如果您看一下它,您将能够很容易地理解它。这是路径: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) { ... }
这意味着您在那里注册的中间件将为您定义的每个路由器实例注册它们。