Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/440.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript expressjs中app.use()、app.get()、router.get()和router.use()之间的区别是什么?_Javascript_Node.js_Express - Fatal编程技术网

Javascript expressjs中app.use()、app.get()、router.get()和router.use()之间的区别是什么?

Javascript expressjs中app.use()、app.get()、router.get()和router.use()之间的区别是什么?,javascript,node.js,express,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',

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

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()的区别是.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
当然,在同一个应用程序中可以有多个路由器。因此,您的代码可以更加结构化。

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

  • .get()
    将只匹配get请求,
    .use()
    将匹配任何类型的请求(POST、PUT、get等)
  • 如果为
    .use()
    提供一个路径,它在匹配方面会更自由,并且如果路径“开始”与传递给
    .use()
    的路径匹配,它就会匹配。通过这种方式,您可以设置一个中间件处理程序,该处理程序将针对广泛的URL集而不是单个URL启动
    .get()
    更常用于受约束的URL,如一个特定的URL
  • app.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);