Node.js expressjs路由器中间件抽象

Node.js expressjs路由器中间件抽象,node.js,express,middleware,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.Rout

我使用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”,服务器将检查令牌,不允许我进入。我知道如果我改变了应用程序的顺序。使用它是可行的,但我不明白为什么我使用的是“路由器中间件”


有人知道吗?

之所以会发生这种情况,是因为如果使用express router实现,您将能够非常容易地理解它,只要您仔细看看。下面是路径:
node\u 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 = function use(fn) { ... }

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

谢谢您的回答。但该理论认为,当注册应用程序中间件“app.use(…)”时,应该发生这种情况,而不是当注册路由器中间件“yourRoute.use(…)”时。如果没有,应用程序中间件和路由器中间件之间的区别是什么?@WikiCode再次检查源代码
node\u modules/express/lib/express.js
第42行是:
mixin(应用程序,proto,false)据我所知,应用程序继承了路由定义。如果您想专门向路由注册中间件,您可以这样做:
app.use('/users',function(req,res,next){security.checkToken(req,res,next);}
你也可以在这里看看:@WikiCode也许我错了!我对变量名感到困惑。我一会儿就回来。@WikiCode应用程序从路由器继承而来。源代码中也有一条注释:
代理路由器#使用()将中间件添加到应用路由器。有关详细信息,请参阅路由器#use()文档。
谢谢,我明白了。在Express中,我对路由器有不同的概念。