Поток выполнения с использованием next () - PullRequest
1 голос
/ 28 февраля 2020

Я новичок в express и у меня есть вопрос о механике функции next ().

  1. Верно ли, что при вызове next () он сразу запускает app.get, а все, что ниже next () будет выполняться асинхронно?
  2. Если так, то почему я казнен? не выводится на консоль после того, как я установил большую задержку в setTimeout ()?

Пожалуйста, объясните ход выполнения в приведенном ниже коде.

app.param('seriesId', (req, res, next) => {
  ... // Check for presence of series
  console.log('I am executed');
  next();
  setTimeout(() => {console.log('Am I executed?')}, 1000); // Prints for 100, does not print for 1000
});

app.get('/:seriesId', (req, res, next) => {
  ... // Call to db to get series object
  res.status(200).json({series: series});
});

1 Ответ

1 голос
/ 28 февраля 2020

Вызов next() обеспечит управление следующим промежуточным программным обеспечением в канале. В вашем примере это будет app.get.

. Однако этот метод не ведет себя как оператор return, поэтому любой код, который вы добавите после, также будет выполнен.

Учитывая приведенный ниже пример, если вы запустите сервер и перейдете к http://localhost: 1337 / foo , операторы журнала будут иметь следующий вид:

  1. что ж, мы здесь
  2. выполнение get
const express = require('express');

const app = express();

app.param('param',(req, res, next) => {
    next();
    setTimeout(() => console.log('well here we are'), 1000);
});

app.get('/:param', (req, res) => {
    setTimeout(() => {
        console.log('executing the get');
        res.status(200).send();
    }, 2000);
});

app.listen(1337);
console.log('app started at http://localhost:1337');

Ветвление в промежуточном программном обеспечении

Хорошей практикой во избежание недоразумений является проверка того, что вызовы next() выполняются в конце вашего выполнение. Например, не делайте этого:

if(aCondition) {
    next()
}
next(new Error('Condition was false'));

Но делайте:

if(aCondition) {
    next()
} else {
    next(new Error('Condition was false'));
}

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

Выполнение асинхронного c кода в промежуточном программном обеспечении

И последнее замечание: если вам необходимо выполнить асинхронный код в промежуточном программном обеспечении, вызывайте next() только после завершения выполнения этого кода .

Не делай:

loadUserFromDB()
    .then(u => req.user = u);
next();

Но делай:

loadUserFromDB()
    .then(u => {
         req.user = u;
         next();
    });
...