Подтвердить что ты не робот

Выйти после 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() не прерывает обработку, какой правильный способ сделать это?

4b9b3361

Ответ 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".