Express js中的app.use(),app.get(),router.get()和router.use()有什么区别?

时间:2018-11-24 06:49:47

标签: javascript node.js express

我仍然不知道这些终点之间的区别,终点都是路线,但是我不知道何时何地应该使用它?在什么情况下?

app.use('/user/:id', function (req, res, next) {
  console.log('Request Type:', req.method)
  next()
});
app.get('/user/:id', function (req, res, next) {
  res.send('USER')
});

router.get('/user/:id', function (req, res, next) {
  res.send('USER')
});

router.use('/user/:id', function (req, res, next) {
  res.send('USER')
});

我,你们可以帮我解决这个问题。

2 个答案:

答案 0 :(得分:0)

.use()和.get()的区别是.use()将侦听任何类型的请求,.get()仅侦听GET请求,例如.post().put()等。

对于路由器,您可以将其视为子路由。

例如,您可以执行以下操作。

router.get('/:id', (req, res, next) => {res.send('user')})
router.post('/', (req, res, next) => {/* some create user logic */})

app.use('/user', router) // if you do this routers will match '/user/:id' and '/user' path

当然,您可以在同一应用中拥有多个路由器。这样您的代码可以更加结构化。

答案 1 :(得分:0)

默认情况下,.use().get()有两个主要区别。

  1. .get()仅匹配GET请求,.use()将匹配任何类型的请求(POST,PUT,GET等)
  2. 如果您提供到.use()的路径,则它的匹配更为自由,如果路径“开始”与您传递到.use()的路径匹配,则它将匹配。这样可以完成操作,因此您可以设置一个中间件处理程序,该处理程序将针对大量URL触发,而不仅仅是单个URL。 .get()更经常用于受约束的URL,例如一个特定的URL。

app.get()router.get()几乎相同。 app对象是一个路由器,它还具有其他一些属性和方法。因此,路由器对象的大多数方法也都在app对象上,反之亦然。

出于各种原因,您可能使用路由器而不是应用程序对象:

  1. 代码模块化。一个模块创建自己的路由器,在其上建立一堆路由,然后导出单个路由器,调用者可以将其添加到当前应用程序中。
  2. 您有一堆路由都使用相同的前缀,并且发现它更容易为该通用前缀设置路由器,然后将路由放在该路由器上,而不必在每个路由中都指定前缀。
  3. li>
  4. 要创建一组共享相同中间件处理的路由,但应用程序中的其他路由不共享该中间件处理。在这种情况下,您将创建路由器,在其上放置一些中间件,然后在该路由器上定义路由。中间件仅对路由到该路由器的路由触发。

一些例子:

// matches /hello and /hello/hi and /hello/goodbye for GET, POST or PUT
app.use('/hello', ...);

// matches only a GET request for /hello
app.get('/hello', ...);

使用路由器帮助模块化的示例。

其中定义了一些路由的模块:

// some_routes.js
const router = require('express').Router();

router.use(someMiddlewareForWholeRouter);

router.get('/hello', ...);
router.get('/goodbye', ...);
router.get('/callme', ...);

module.exports = router;

在您的应用中使用该模块:

// app.js
const some_routes = require('./some_routes.js');

// hook up all routes from some_routes with the path prefix of /greeting
app.use('/greetings', some_routes);