【问题标题】:Difference Between app.use() and router.use() in ExpressExpress 中 app.use() 和 router.use() 的区别
【发布时间】:2015-01-29 09:57:03
【问题描述】:

我刚刚在 express 上阅读文档,发现这两个术语,app.use();router.use();

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

我读到了路由器here。我还在 SO What is the difference between "express.Router" and routing using "app.get"? 上发现了类似的问题 和Difference between app.all('*') and app.use('/'),但他们并没有真正回答我的问题。谢谢。

【问题讨论】:

    标签: node.js express


    【解决方案1】:

    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);
    
    • 如果您在浏览器中打开 /firstfun 将被调用,
    • 对于 /sudbigger 将被调用
    • 对于 /usersmaller 将被调用

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

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

    【讨论】:

    • 我已经编辑了我的答案@NaeemShaikh,请重新查看。
    • 但是当你可以去的时候为什么要使用路由器 app.use('/first/sud', small);和 app.use('/first/user',更大)?我的意思是他们是否创建了路由器,所以我们不必在第一个参数中输入额外的东西?
    • 为什么 OP 询问 router.use 但这个答案是指 router.get
    • 不回答这个问题,不知道为什么这么多赞成
    • 为什么这个答案甚至被标记为正确?下面这个不仅是正确的,而且还像7个月大......这只是让来这里的人感到困惑
    【解决方案2】:

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

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

    然后,您将仅使用router.use(yourAuthMiddleware()); 为 api 路由器安装身份验证中间件。

    如果您的应用程序需要所有路由的有效用户,请使用 app.use(yourAuthMiddleware()); 为该应用程序安装中间件

    【讨论】:

    • 我可以创建一个新的路由器,然后在另一个路由器中use它吗?喜欢router1.use('/path', router2);
    • 这个答案很明确,应该是公认的答案。路由器经常被误用在应用更合适的地方。
    【解决方案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,然后它会根据controllerIndex.ads执行带有'admin'端点的下一行.adListingAdmin 方法。

    【讨论】:

    • 如果您希望对应用程序的每个请求执行该函数,则无需向app.use 提供路径。
    • @shubham 你解释得很好,对我很有帮助。对于带有中间件的路由器,我们也可以将其合并为单行,例如 router.delete("/:id/delete", middleware.checkToken, userController.deleteUser)
    【解决方案4】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-02-14
      • 2012-12-17
      • 1970-01-01
      • 2013-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多