Почему цепочечные методы get (), post () и put () не требуют аргумента пути? - PullRequest
0 голосов
/ 09 мая 2018

Я изучаю экспресс из различных учебных пособий и у меня есть приложение, работающее локально, но я бы хотел лучше понять, что делает каждая часть кода.

Я немного озадачен примером в разделе 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(), что является документированной функцией верхнего уровня здесь .

И я вижу, что методы .get(), post() и put() связаны с методом route(), который задокументирован здесь .

Я запутался в том, что в документации указано, что аргументы для методов .get(), post() и put() имеют следующий формат:

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

Почему цепочечные методы .get(), post() и put() не требуют аргумента path, а вместо этого имеют единственную функцию в качестве аргумента, которая возвращает значения из Request (иначе req) и Ответ (он же res) параметры объекта?

Я, очевидно, упускаю что-то простое, поэтому указатели на документацию, которые могли бы помочь мне лучше понять различия между этими методами при вызове прямо из app, например, app.get(), и из route(), например, app.route('/book').get(), могли бы быть высоко ценится.

Редактировать: По сути, я хотел бы знать, есть ли документация, определяющая необходимый формат аргументов для методов .get(), post() и put() при вызове из возвращенного объекта маршрута от вызова app.route("/book"), потому что это не похоже на то, что задокументировано, то есть path, callback [, callback ...].

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

app.route ()

Согласно документации, метод app.route:

Возвращает экземпляр одного маршрута, который затем можно использовать для обработки глаголов HTTP с помощью дополнительного промежуточного программного обеспечения. Используйте app.route (), чтобы избежать дублирования имен маршрутов (и, следовательно, ошибок опечаток).

Это означает, что app.route() берет только путь и возвращает route object. Который будет иметь все методы глагола http для обработки промежуточного программного обеспечения по одному пути, get, post, delete, post, put, patch и т. Д.

Почему?

Чтобы просто иметь маршруты, которые имеют одинаковый путь, но разные 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().

Согласно документации для пост-маршрута: HTTP POST-запросы к указанному пути с указанными функциями обратного вызова.

Почему?

Для случаев, когда у вас нет одного пути для нескольких HTTP-запросов. Допустим,

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

Вышеуказанный маршрут является своего рода отдельным маршрутом и используется только для удаления определенного комментария в книге.

Надеюсь, мне удалось устранить разницу.

Ссылка на ссылку для документов: https://expressjs.com/en/4x/api.html#router.route

Edit:

Поскольку нет подходящих документов, доступны методы перечисления, предоставляемые объектом маршрута: Для получения дополнительной информации добавьте ссылку 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.

0 голосов
/ 09 мая 2018

Смысл связанного метода в том, что они имеют одинаковый путь.

Итак, вы можете написать это:

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

Это означает, что если вы меняете конечную точку, она изменяется для всех методов, вы не можете записать опечатку в одном методе ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...