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


87

我刚刚阅读Express文档,发现了这两个术语,app.use();并且router.use();

我知道app.use();在节点中用于在路径上安装中间件,并且我们经常在大多数节点应用中使用它。但是router.use();两者都一样吗?如果没有,有什么区别?

在这里阅读了有关路由器的信息。我还在SO上找到类似的问题,“ express.Router”和使用“ app.get”进行路由之间有什么区别?app.all('*')和app.use('/')之间的区别,但它们并没有真正回答我的问题。谢谢。

Answers:


122

router.get仅用于定义子路径。考虑以下示例:

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 / sudsmaller则会调用该函数。
  • 如果打开/ first / user,则将bigger调用该函数。

简而言之,app.use('/first', router)将中间件安装在路径/ first处,然后相应地router.get设置子路径。


但是,如果我们改为使用以下内容:

app.use('/first', fun);

app.get('/sud', bigger);

app.get('/user', smaller);
  • 如果您在浏览器中打开/ firstfun将会被调用,
  • 对于/ sudbigger将被调用
  • 对于/ usersmaller将被调用

但是请记住/ first / sud,不会调用任何函数。

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


我已经编辑了答案@NaeemShaikh请重新看一下。
Sudhanshu Gaur

4
但是,为什么可以在使用app.use('/ first / sud',small)时使用路由器?和app.use('/ first / user',bigger)?我是说他们创建了路由器,所以我们不必在第一个参数中输入多余的东西吗?
mskw

好看的问题,我不正确知道,但我认为这实际上是路由到将app.use用于中间件的URL上进行定向的事情,现在您可以使用app.use('/ first / sud',small); 但是假设您的应用中有很多以/ first / second / third / fourth开头的路由,那么您会在此处将每条路由/ first / second / third / fourth / x设为否,不,您将在这里使用router记住,两者都很好,但是router只是对于这些URL目的而进行的
Sudhanshu野牛

因此,这意味着我们不能使用进行嵌套router。我们只能这样做app。那是对的吗?
Mr_Perfect

OP为什么要询问有关router.use此答案的答复router.get
蒂姆·海尔曼

72

router.use();为特定路由器提供的路由app.use();挂载中间件,为应用程序的所有路由挂载中间件(或如果使用,则为应用程序指定的路由匹配挂载中间件app.use('/ANYROUTESHERE', yourMiddleware());)。

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

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

如果您有一个需要所有路径都有效用户的应用程序,请使用以下命令安装该应用程序的中间件 app.use(yourAuthMiddleware());


我可以先创建一个新路由器,然后use在另一个路由器中创建它吗?喜欢router1.use('/path', router2);
CodyBugstein 2015年

6
这个答案很明确,应该是公认的答案。经常会在应用程序更合适的地方滥用路由器。
AturSams

1

app.use()用于在指定路径上安装一个或多个中间件函数,当所请求路径的基数与path匹配时执行中间件函数。

router.use()用于中间件功能,默认安装路径为“ /”。

但是在app.use()中,您将必须指定一个类似的路径:

 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”端点执行下一行。


1
app.use如果您希望对应用程序发出的每个请求都执行该功能,则无需提供路径。
jacefarm

@shubham您的解释很好,对我很有帮助。如果是带有中间件的路由器,我们也可以将其合并为单行,例如router.delete(“ /:id / delete”,middleware.checkToken,userController.deleteUser)
Sourabh Bhutani
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.