为什么链接的get(),post()和put()方法不需要路径参数?

时间:2018-05-09 07:24:26

标签: node.js express routes

我正在从各种教程中学习快速,并且有一个在本地工作的应用程序,但我想更好地理解代码的每个部分的作用。

我对app.route()部分中的示例感到有点难过:

https://expressjs.com/en/guide/routing.html

app.route('/book')
  .get(function (req, res) {
    res.send('Get a random book')
  })
  .post(function (req, res) {
    res.send('Add a book')
  })
  .put(function (req, res) {
    res.send('Update the book')
  })

我可以看到app等于express(),这是一个记录为here的顶级函数。

我可以看到.get()post()put()方法被链接到route()方法,该方法记录为here

我感到困惑的是,文档声明.get()post()put()方法的参数采用以下格式:

app.get(path, callback [, callback ...])
app.post(path, callback [, callback ...])
app.put(path, callback [, callback ...])

为什么链式.get()post()put()方法不需要path参数,而是使用单数函数作为返回{的值的参数{3}}(又名req)和Request(又名res)对象参数?

我显然遗漏了一些简单的东西,所以指向文档的指针可以帮助我更好地理解直接从app调用这些方法之间的区别,例如app.get()route() ,例如app.route('/book').get()将非常感激。

编辑:基本上,我想知道是否有文档定义了.get()post()put()方法所需的参数格式从调用app.route("/book")返回的路由对象调用时,因为它似乎不是所记录的内容,即path, callback [, callback ...]

2 个答案:

答案 0 :(得分:1)

链式方法的意义在于它们具有相同的路径。

所以你可以这样写:

app.route('/book')
  .get(function (req, res) {
    res.send('Get a random book')
  })
  .post(function (req, res) {
    res.send('Add a book')
  })
  .put(function (req, res) {
    res.send('Update the book')
  })

而不是

  app.get('/book', function (req, res) {
    res.send('Get a random book')
  });
  app.post('/book', function (req, res) {
    res.send('Add a book')
  });
  app.put('/book', function (req, res) {
    res.send('Update the book')
  });

这意味着如果你改变了端点,那么所有方法都会改变它,你就不能在一种方法中写错误...

答案 1 :(得分:1)

<强> app.route()

根据文档,app.route方法:

  

返回单个路由的实例,然后可以使用该实例处理带有可选中间件的HTTP谓词。使用app.route()可以避免重复的路由名称(从而避免拼写错误)。

这意味着,app.route()只接受路径并返回route object。哪个http动词方法可以处理针对一条路径的中间件,getpostdeletepostputpatch

<强>为什么吗

简单地拥有路径相同但HTTP请求不同的路由。喜欢:

app.route('/books')
  .get() // To get the list of objects
  .post() // To save a new book.

个别HTTP方法

另一方面,express在app上提供了用于处理HTTP请求的单独方法。与app.get()app.post()app.delete()一样。

  

根据post route的文档:HTTP POST使用指定的回调函数向指定路径发出请求。

<强>为什么吗

对于您没有多条HTTP请求的路径的情况。让我们说:

app.delete('/books/:bookId/comments/:commentId', function(){});

上述路线是一种单一路线,仅用于删除书籍上的特定评论。

我希望我能够清除差异。

  

文档的参考链接:https://expressjs.com/en/4x/api.html#router.route

修改

由于路径对象提供的列表方法没有合适的文档: 有关更多信息,请将github链接添加到快速路由器。

https://github.com/expressjs/express/blob/master/lib/router/route.js

以下是Express的路由器代码,它为所有方法添加处理程序。

methods.forEach(function(method){
  Route.prototype[method] = function(){
    var handles = flatten(slice.call(arguments));

    for (var i = 0; i < handles.length; i++) {
      var handle = handles[i];

      if (typeof handle !== 'function') {
        var type = toString.call(handle);
        var msg = 'Route.' + method + '() requires a callback function but got a ' + type
        throw new Error(msg);
      }

      debug('%s %o', method, this.path)

      var layer = Layer('/', {}, handle);
      layer.method = method;

      this.methods[method] = true;
      this.stack.push(layer);
    }

    return this;
  };
});

在顶部的这个文件中,它有:

var methods = require('methods');

  

方法:https://github.com/jshttp/methods

因此,链式方法所需的参数为unlimited functions作为请求handlers/middlewares