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

时间:2014-12-01 11:42:15

标签: node.js express

我刚刚阅读了有关快递的文档,并找到了这两个词,app.use();router.use();

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

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

3 个答案:

答案 0 :(得分:88)

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

答案 1 :(得分:58)

router.use();为特定路由器所服务的路由安装中间件,app.use();为应用的所有路由(或者使用app.use('/ANYROUTESHERE', yourMiddleware());时匹配指定路由的中间件)安装中间件。

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

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

如果你有一个应用程序虽然需要所有路由的有效用户,请使用app.use(yourAuthMiddleware());

为应用程序安装中间件

答案 2 :(得分:1)

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方法。