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

Nae*_*ikh 71 node.js express

我刚刚阅读了快递文档并找到了这两个术语,app.use();并且router.use();

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

在这里读到了路由器.我也在SO上发现了类似的问题"express.Router"与使用"app.get"的路由有什么区别?app.all('*')和app.use('/')之间的区别,但它们并没有真正回答我的问题.谢谢.

Sud*_*aur 95

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);
Run Code Online (Sandbox Code Playgroud)
  • 如果你打开/ first/sud,那么smaller函数将被调用.
  • 如果你打开/ first/user,那么bigger函数将被调用.

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


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

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

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

app.get('/user', smaller);
Run Code Online (Sandbox Code Playgroud)
  • 如果您在浏览器中打开/第一个,fun将被调用,
  • 对于/ sud,bigger会被调用
  • 对于/ user,smaller将被调用

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

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

  • 没有回答问题,不知道为什么这么多人点赞 (6认同)
  • 但是为什么在你可以去app.use('/ first/sud',更小)时使用路由器; 和app.use('/ first/user',更大)?我的意思是他们创建路由器,所以我们不必在第一个参数中键入额外的东西? (4认同)
  • 为什么OP询问“router.use”,但这个答案回应引用“router.get”? (4认同)
  • 为什么这个答案甚至被标记为正确?下面的不仅是正确的,而且还像7个月大一样......这对来这里的人来说只是令人困惑 (4认同)

Lau*_*ura 62

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

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

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

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

  • 这个答案很明确,应该是公认的答案.在应用程序更合适的地方,路由器经常被滥用. (5认同)