Как указать код ошибки HTTP?


161

Я пытался:

app.get('/', function(req, res, next) {
    var e = new Error('error message');
    e.status = 400;
    next(e);
});

и:

app.get('/', function(req, res, next) {
    res.statusCode = 400;
    var e = new Error('error message');
    next(e);
});

но всегда объявляется код ошибки 500.


1
Мой ответ на связанный вопрос может помочь: stackoverflow.com/questions/10170857/…
Pickels

2
Не могли бы вы обновить принятый ответ?
Дэн Мандл

Ответы:


293

В документах Express (Version 4+) вы можете использовать:

res.status(400);
res.send('None shall pass');

http://expressjs.com/4x/api.html#res.status

<= 3,8

res.statusCode = 401;
res.send('None shall pass');

37
+1 за использование последней версии API. Если вы хотите отправить больше по проводам, просто цепочка:res.status(400).json({ error: 'message' })
TyMayn

1
@Mikel, если у вас нет переменной ответа, вы не можете отправить ответ.
Дэн Мандл

1
Это все устарело сейчас, вы должны использовать res.sendStatus(401);.
Cipi

1
Этот ответ был бы намного более полным, если бы он закончился res.send('Then you shall die').
Goodvibration

1
@Cipi У тебя есть источник для этого? В документации не указано, что .status()она устарела. .sendStatus()это просто сокращение для .status(code).send(codeName)где codeNameстандартный текст ответа HTTP для данного code.
Джеймс Койл


20

Я хотел бы централизовать создание ответа об ошибке следующим образом:

app.get('/test', function(req, res){
  throw {status: 500, message: 'detailed message'};
});

app.use(function (err, req, res, next) {
  res.status(err.status || 500).json({status: err.status, message: err.message})
});

Поэтому у меня всегда один и тот же формат вывода ошибок.

PS: конечно, вы можете создать объект для расширения стандартной ошибки, например:

const AppError = require('./lib/app-error');
app.get('/test', function(req, res){
  throw new AppError('Detail Message', 500)
});

'use strict';

module.exports = function AppError(message, httpStatus) {
  Error.captureStackTrace(this, this.constructor);
  this.name = this.constructor.name;
  this.message = message;
  this.status = httpStatus;
};

require('util').inherits(module.exports, Error);

16

Вы можете использовать res.send('OMG :(', 404);толькоres.send(404);


Но я хочу, чтобы код ошибки был послан промежуточному программному обеспечению eventHandler, чтобы отображалась пользовательская страница ошибок Express.
техник

12
Для тех, кто читает это в 2016 году: согласно Express 4.x, res.send(404)устарела. Это сейчас res.sendStatus(404). expressjs.com/en/api.html#res.sendStatus
0xRm

12

В экспрессе 4.0 они правильно поняли :)

res.sendStatus(statusCode)
// Sets the response HTTP status code to statusCode and send its string representation as the response body.

res.sendStatus(200); // equivalent to res.status(200).send('OK')
res.sendStatus(403); // equivalent to res.status(403).send('Forbidden')
res.sendStatus(404); // equivalent to res.status(404).send('Not Found')
res.sendStatus(500); // equivalent to res.status(500).send('Internal Server Error')

//If an unsupported status code is specified, the HTTP status is still set to statusCode and the string version of the code is sent as the response body.

res.sendStatus(2000); // equivalent to res.status(2000).send('2000')

11

Версия промежуточного программного обеспечения errorHandler в комплекте с некоторыми (возможно, более старыми?) Версиями экспресс-кода имеет код состояния. Версия, задокументированная здесь: http://www.senchalabs.org/connect/errorHandler.html, с другой стороны, позволяет вам делать то, что вы пытаетесь сделать. Так что, возможно, попытка обновления до последней версии Express / Connect.


9

Из того, что я видел в Express 4.0, это работает для меня. Это пример аутентификации необходимого промежуточного программного обеспечения.

function apiDemandLoggedIn(req, res, next) {

    // if user is authenticated in the session, carry on
    console.log('isAuth', req.isAuthenticated(), req.user);
    if (req.isAuthenticated())
        return next();

    // If not return 401 response which means unauthroized.
    var err = new Error();
    err.status = 401;
    next(err);
}

8

Старый вопрос, но все еще подходит для Google. В текущей версии Express (3.4.0) вы можете изменить res.statusCode перед вызовом next (err):

res.statusCode = 404;
next(new Error('File not found'));

Что дальше делать?
Стив К

nextвызывает следующий обработчик, который в express.js обычно пытается отобразить страницы с ошибками.
Kurotsuki


2

Я попытался

res.status(400);
res.send('message');

..но это дало мне ошибку :

(узел: 208) UnhandledPromiseRejectionWarning: Ошибка: невозможно установить заголовки после их отправки.

Это работа для меня

res.status(400).send(yourMessage);

0

Я бы порекомендовал обработать отправку кодов ошибок http с помощью пакета Boom .

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.