关于node.js:Express中app.use()和router.use()之间的区别

Difference Between app.use() and router.use() in Express

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

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

我在这里了解了路由器。 我还在SO上找到类似的问题," express.Router"和使用" app.get"进行路由之间有什么区别?
和app.all(*)和app.use(/)之间的区别,但是它们并不能真正回答我的问题。 谢谢。


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

1
2
3
4
5
6
7
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相应地设置子路径。

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

1
2
3
4
5
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


router.use();为特定路由器服务的路由安装中间件,app.use();为应用程序的所有路由(或与使用x2>匹配的路由匹配)安装中间件。

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

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

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


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

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

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

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

要么

1
2
3
4
5
app.use('/ads', function(req, res, next) {

  // write your callback code here.

    });

但是在使用router.use()时,您只能提供中间件,如下所示:

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

要么

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

要么

1
2
3
4
//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"端点执行下一行。