Вызов next()
обеспечит управление следующим промежуточным программным обеспечением в канале. В вашем примере это будет app.get
.
. Однако этот метод не ведет себя как оператор return
, поэтому любой код, который вы добавите после, также будет выполнен.
Учитывая приведенный ниже пример, если вы запустите сервер и перейдете к http://localhost: 1337 / foo , операторы журнала будут иметь следующий вид:
- что ж, мы здесь
- выполнение 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();
});