Express中的app.use()和router.use()之间的区别

我只是在快速阅读文档,发现这两个术语, app.use();router.use();

我知道app.use(); 在节点中用于在一个path上挂载中间件 ,我们经常在大多数节点应用程序中使用它。 但是什么是router.use(); 他们都一样吗? 如果不是,有什么区别?

我在这里读了关于路由器。 我也在SO上发现了类似的问题。 “express.Router”和使用“app.get”的路由之间有什么区别? 和app.all('*')和app.use('/')之间的区别 ,但是他们并没有真正回答我的问题。 谢谢。

router.get仅用于定义子path。 考虑这个例子:

 var router = express.Router(); app.use('/first', router); // Mount the router as middleware at path /first router.get('/sud', smaller); router.get('/user', bigger); 

现在,如果您在浏览器中打开/ first / sud ,则会调用smaller函数。 如果你打开第一个/用户 ,那么bigger将被调用。 简而言之,app.use('/ first',路由器)将中间件安装在path / first处 ,然后router.get设置子path。

但是如果我们改用:

 app.use('/first', fun); app.get('/sud', bigger); app.get('/user', smaller); 

现在,如果您打开/首先在您的浏览器,然后fun将被称为和/ sudbigger将被称为和/用户smallerfunction将被调用。 …但请记住/ first / sud ,没有函数会被调用。

此链接也可能有所帮助: http : //expressjs.com/api.html#router

router.use(); 装载由特定路由器服务的路由的中间件app.use(); 为应用程序的所有path装载中间件(或与使用app.use('/ANYROUTESHERE', yourMiddleware());指定的路由相匹配的中间件)。

示例用例可以是一个具有标准路由的路由器和一个处理api路由的路由器的应用,这需要有效的用户。

然后,您只能使用router.use(yourAuthMiddleware());装载api路由器的身份validation中间件router.use(yourAuthMiddleware());

如果你有一个应用程序,虽然这需要一个有效的用户的所有路线,与app.use(yourAuthMiddleware());安装应用程序的中间件app.use(yourAuthMiddleware());

app.use()用于在指定的path上安装中间件function或中间件function,当请求的path的基础匹配path时,中间件function被执行。

router.use()用于中间件function或者function,缺省情况下将path挂载到“/”。

但是在app.use()中,你必须给出一个指定的path:

  var adsRouter = require('./adsRouter.js'); app.use('/ads', adsRouter); 

要么

 app.use('/ads', function(req, res, next) { // write your callback code here. }); 

但是在使用router.use()的时候,你只能给中间件,像这样:

 router.use(function(req, res, next) { console.log('%s %s %s', req.method, req.url, req.path); next(); }); 

要么

 router.use('/test', function(req, res, next) { // write your callback code here. next(); }); 

要么

 //in router.js router.use('/admin', authUtil.verifySessionId, authUtil.verifyLisencee); router.post('/admin', controllerIndex.ads.adListingAdmin); 

在上面的代码中,当结束点是'/ admin'时,首先调用authUtil.verifySessionId和authUtil.verifyLisencee,然后根据controllerIndex.ads.adListingAdmin方法执行下一行'admin'结束点。