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

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')
});

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

最佳答案

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

  • .get()仅匹配GET请求,.use()将匹配任何类型的请求(POST,PUT,GET等)
  • 如果提供.use()的路径,则它的匹配更为自由,如果路径“开始”与传递给.use()的路径匹配,它将匹配。这样可以完成操作,因此您可以设置一个中间件处理程序,该处理程序将针对广泛的URL触发,而不仅仅是单个URL。 .get()通常与受约束的URL(例如一个特定的URL)一起使用。
  • app.get()router.get()几乎相同。 app对象是一个路由器,它还具有其他一些属性和方法。因此,路由器对象的大多数方法也都在app对象上,但反之则不然。

    出于多种原因,您可能使用路由器而不是应用程序对象:
  • 代码模块化。模块创建自己的路由器,在其上设置一堆路由,然后导出单个路由器,调用者可以将其添加到当前应用程序中。
  • 您有一堆路由都使用相同的前缀,并且发现为该通用前缀设置路由器更干净,然后将路由放在该路由器上,而不必在每个路由中都指定前缀。
  • 创建一组共享相同中间件处理,但应用程序中其他路由不共享该中间件处理的路由。在这种情况下,您将创建路由器,在其上放置一些中间件,然后在该路由器上定义路由。中间件仅针对路由到该路由器的路由触发。


  • 一些例子:
    // 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);
    

    10-07 16:01
    查看更多