Выйти после res.send() в Express.js
У меня довольно простое приложение Express.js с компонентом входа, который я хотел бы закрыть раньше, если логин не удался. Я вижу, что приложение не делает этого, и я не нашел окончательного ответа, который указывает, прекращает ли вызов res.send()
дальнейшую обработку. Здесь мой код в его нынешнем виде:
client.login( username, password, function( auth, client ) {
if( !auth ) {
res.send( 401 );
}
// DO OTHER STUFF IF AUTH IS SUCCESSFUL
}
Если я правильно прочитал исходный код, он должен завершить запрос (прервать дальнейшую обработку), но я новичок в node, поэтому я не совсем готов доверять тому, что, как я думаю, читаю. Чтобы сварить его, я предполагаю, что я в основном ищу окончательный ответ из более надежного источника, что моя собственная интерпретация незнакомого исходного кода. Если send()
не прерывает обработку, какой правильный способ сделать это?
Ответы
Ответ 1
Если вы используете Express в качестве своей платформы, вы должны вместо этого вызвать next().
Каждый обработчик в экспрессе получает 3 параметра (unlinke 2 для базового http): req
, res
и next
next
- это функция, которая при вызове без аргументов запускает следующий обработчик в цепочке промежуточного программного обеспечения.
Если next
вызывается с аргументами, этот аргумент будет интерпретироваться как ошибка, независимо от типа этого аргумента.
Его подпись next([error])
. Когда next вызывается с ошибкой, тогда вместо вызова следующего обработчика в цепочке промежуточного программного обеспечения он вызывает обработчик ошибок. Вы должны обработать код ответа 401 в этом обработчике ошибок. Смотрите это для получения дополнительной информации об обработке ошибок в Express
РЕДАКТИРОВАТЬ: Как прокомментировал @Baptiste Costa, простой вызов next()
не прекратит текущее выполнение, а вызовет следующее промежуточное ПО. Рекомендуется использовать return next()
вместо этого, чтобы Node не выдавал ошибки в дальнейшем (например, can't set headers after they are sent
- error). Это включает в себя вышеупомянутое предложение об ошибках, которое является распространенным:
return next(new Error([error]));
Ответ 2
Конечно, выражение не может волшебным образом заставить вашу функцию javascript прекратить выполнение из другого места.
Мне не нравится следующее ([ошибка]) решение, потому что я думаю, что ошибки должны использоваться только для тех обстоятельств, которые обычно не ожидаются (например, недостижимая база данных или что-то еще). В этом случае простой неправильный пароль вызовет ошибку. Общим соглашением является не использование исключений/ошибок для обычного потока управления.
Поэтому я рекомендую поместить оператор return после вызова res.send, чтобы ваша функция перестала выполняться дальше.
client.login( username, password, function( auth, client ) {
if( !auth ) {
res.send( 401 );
return;
}
// DO OTHER STUFF REALLY ONLY IF AUTH IS SUCCESSFUL
}
Ответ 3
Просто сделайте что-то подобное, чтобы остановить дальнейшее выполнение.
function (request, response, next) {
var path = request.body.path;
if(path === undefined){
response.status(HttpStatus.BAD_REQUEST);
response.send('path is required!');
}
next(response)
};
Ответ 4
Вам нужно только сделать возврат, чтобы закончить поток:
return res.send( 401 );
Это отправит ответ 401 назад и не будет продвигаться вперед в потоке.
Ответ 5
Почему никто не предлагает использовать блок "else"?
if(!auth){
// Auth fail code
res.send 'Fail'
} else {
// Auth pass code
res.send 'Pass'
}
'next' используется при создании собственного промежуточного программного обеспечения для "app.use(function (req, res, next));".
Если вы настроили такой маршрут, как "app.get(route, function (req, res)); то код в функции - это то, где вы можете указать код, который вы указываете, без необходимости использовать" next".