Вопрос о функции next () в expressjs - PullRequest
2 голосов
/ 22 апреля 2019

У меня проблемы с тем, чтобы обернуть голову вокруг концепции функции next () в express.js.Я предполагаю, что мой первый вопрос будет следующим: () функция только express.js?Мой второй вопрос в следующем примере: что будет дальше?После консольной функции она переходит к следующей функции, которая вызывается после?Я так растерялся.

var cb0 = function (req, res, next) {
  console.log('CB0');
  next();
}

Ответы [ 4 ]

4 голосов
/ 22 апреля 2019

В Express (и других аналогичных системах) каждый запрос проходит через серию промежуточного программного обеспечения функций (например, cb0).У каждого из них есть возможность что-то сделать с запросом.

Поскольку функция промежуточного программного обеспечения может быть асинхронной (например, чтение файла, запрос базы данных и т. Д.), Express не может простонапрямую вызвать следующий бит промежуточного программного обеспечения после вызова предыдущего.Таким образом, вместо этого он передает функции промежуточного программного обеспечения функцию next, которую промежуточное программное обеспечение использует, чтобы сказать: «Я закончил, выполните следующий шаг».(В версии Express вы также можете передать аргумент next, так как Aikon Mogwai указывает : если вы передадите ему Error, он вызовет обработку ошибки для маршрута. Если вы передадите его"route", он переходит к следующему маршрутизатору и т. Д.).

Таким образом, концепция функции next не является специфичной для Express, но конкретное использование в этом примере:

Вот очень упрощенный пример не использования Express, а демонстрация того, что он делает с функциями промежуточного программного обеспечения при обработке запроса:

const app = {
  middleware: [],
  use(callback) {
    this.middleware.push(callback);
  }
};

app.use((req, res, next) => {
  console.log("First handler synchronous part");
  setTimeout(() => {
    console.log("First handler async part finished");
    next();
  }, 800);
});

app.use((req, res, next) => {
  console.log("Second handler is entirely synchronous");
  next();
});

app.use((req, res, next) => {
  console.log("Third handler synchronous part");
  setTimeout(() => {
    console.log("Third handler async part finished");
    next();
  }, 800);
});

// Code handling an incoming request
function handleRequest(req, app) {
  // Copy the handlers
  const middleware = app.middleware.slice();
  // Create a "response"
  const res = {};
  // Call the handlers
  let index = 0;
  next();
  function next() {
    if (index < middleware.length) {
      // Call the handler, have it call `next` when it's done
      middleware[index++](req, res, next);
    } else {
      console.log("Request completed");
    }
  }
}

handleRequest({}, app);

Вероятно, стоит упомянуть, что этот стиль ручной асинхронной обработки промежуточного программного обеспечения был заменен обещаниями в Koa.js , который являетсяновый (эр) фреймворк от тех же людей, что и Express.js.С помощью Koa вы выполняете свои функции обратного вызова async, и внутренние компоненты Koa ждут обещания, которое возвращает функция async для расчета, а затем воздействуют на результат ее установки (например, отклонение или выполнение, значение, которое она выполняет, и т. Д..).

2 голосов
/ 22 апреля 2019

Далее используется для передачи управления следующей функции промежуточного программного обеспечения. Если нет, то запрос будет оставлен висеть или открыт. Вызов этой функции вызывает следующую функцию промежуточного программного обеспечения в приложении. Функция next () не является частью Node.js или Express API, но является третьим аргументом, который передается в функцию промежуточного программного обеспечения.

1 голос
/ 22 апреля 2019
var express = require('express')
var app = express()

var CB0 = function (req, res, next) {
  console.log('CB0')
  next()
}

app.use(CB0)

app.get('/', function (req, res) {
  res.send('Hello World!')
})

app.listen(3000)

Каждый раз, когда приложение получает запрос и печатает консоль «CB0» в окне терминала.

Функции промежуточного программного обеспечения, которые загружаются первыми, также выполняются первыми.

Функция промежуточного программного обеспечения CB0 просто печатает сообщение, а затем передает запрос следующей функции промежуточного программного обеспечения в стеке, вызывая функцию next ().

1 голос
/ 22 апреля 2019

Функция next() запрашивает следующую функцию промежуточного программного обеспечения в приложении. Функция next() не является частью Node.js или Express API, но это третий случай / аргумент, который передается в функцию промежуточного программного обеспечения. Функция next() может быть названа как угодно, но по соглашению она всегда называется «следующая». Чтобы избежать путаницы, всегда используйте это соглашение.

Для получения дополнительной информации, вы можете посетить официальный учебник Экспресс

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