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

114

我刚阅读了express的文档,发现了两个术语:app.use();router.use();

我知道app.use();用于在路径上挂载一个中间件,我们在大多数node应用程序中经常使用它。但是router.use();是什么?它们是否都相同?如果不是,有什么区别?

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

5个回答

163

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/sud,那么将调用smaller函数。
  • 如果你打开/first/user,那么将调用bigger函数。

简而言之,app.use('/first', router)在路径/first处挂载中间件,然后router.get根据需要设置子路径。


但是,如果我们改用以下方式:

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

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

app.get('/user', smaller);
  • 如果您在浏览器中打开/first,将调用fun
  • 对于/sud,将调用bigger
  • 对于/user,将调用smaller

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

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


我已经编辑了我的回答@NaeemShaikh,请再看一下。 - Sudhanshu Gaur
7
为什么要使用路由器(router),而不是直接使用 app.use('/first/sud', smaller); 和 app.use('/first/user',bigger)?我的意思是,他们创建路由器是为了让我们在第一个参数中不必多加输入吗? - mskw
10
дёєд»Ђд№€жЏђй—®иЂ…иЇўй—®router.useпјЊдЅ†иї™дёЄе›ћз­”еЌґжЏђе€°дє†router.getпјџ - Tim Heilman
5
没有回答问题,不确定为什么有那么多赞。 - Operator
4
为什么这个答案会被标记为正确的?下面那个不仅正确而且比这个早了大约7个月... 这只会让来到这里的人感到困惑。 - Sammaye
显示剩余2条评论

96

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

例如,一个应用程序可能有一个标准路由器和一个处理需要有效用户的API路由器。然后,您可以仅为API路由器挂载身份验证中间件,方法是使用 router.use(yourAuthMiddleware())

但是,如果您有一个要求所有路由都需要有效用户的应用程序,请使用 app.use(yourAuthMiddleware())来挂载应用程序的中间件。


我能否创建一个新的路由器,然后在另一个路由器中使用它?就像 router1.use('/path', router2); 这样。 - CodyBugstein
8
这个回答很清晰,应该被接受。路由器经常被错误地使用,而应用程序可能更合适。 - AturSams

3

app.use()函数用于将中间件函数挂载到指定路径,当请求的路径匹配给定的路径时,中间件函数将被执行。

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,然后执行下一行带有'admin'终点的语句,并根据controllerIndex.ads.adListingAdmin方法执行。

1
如果您希望对应用程序中的每个请求执行函数,则无需向app.use提供路径。 - jacefarm
@shubham,你讲解得非常好,对我很有帮助。在使用中间件的路由器情况下,我们也可以将其合并为单行,例如:router.delete("/:id/delete", middleware.checkToken, userController.deleteUser) - Sourabh Bhutani

1

当查看Express JS路由文档(https://expressjs.com/en/guide/routing.html#express-router)时:

使用express.Router类创建模块化、可挂载的路由处理程序。Router实例是一个完整的中间件和路由系统;因此,它通常被称为“迷你应用程序”。

使用express.Router()创建的Router在功能上与使用express()创建的app没有区别;它就像是路由/处理程序/服务/数据库等的逻辑分组。最大的区别在于它所影响的范围。路由器只影响自己的范围,而应用程序则像是您的Web/App服务器的主/全局范围。您可以在一个主应用程序/Web服务器实例上运行许多路由器或“应用程序”。这就是为什么您可以通过app.listen(80)监听应用程序实例上的请求,但不能在路由器上监听的原因。


1

app.use(middleware): 应用级别的中间件。

router.use(middleware): 路由器级别的中间件。

("middleware" 指的是在处理请求和发送响应之间调用的方法/函数/操作。)

请查看https://expressjs.com/en/guide/using-middleware.html,了解在 Express 应用程序中使用的不同类型的中间件的比较。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接