Jak określić kod błędu HTTP?


161

Próbowałem:

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

i:

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

ale zawsze podawany jest kod błędu 500.


1
Moja odpowiedź na podobne pytanie może pomóc: stackoverflow.com/questions/10170857/…
Pickels

2
Czy mógłbyś zaktualizować zaakceptowaną odpowiedź?
Dan Mandle

Odpowiedzi:


293

Zgodnie z dokumentami Express (wersja 4+) możesz użyć:

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 za używanie najnowszej wersji interfejsu API. Jeśli chcesz wysłać więcej, po prostu łańcuch:res.status(400).json({ error: 'message' })
TyMayn

1
@Mikel jeśli nie masz zmiennej odpowiedzi, nie możesz wysłać odpowiedzi.
Dan Mandle

1
To wszystko jest teraz przestarzałe, powinieneś użyć res.sendStatus(401);.
Cipi

1
Ta odpowiedź byłaby o wiele pełniejsza, gdyby kończyła się na res.send('Then you shall die').
goodvibration

1
@Cipi Czy masz do tego źródło? Dokumentacja nie wskazuje, że .status()jest przestarzała. .sendStatus()jest tylko skrótem, .status(code).send(codeName)gdzie codeNamejest standardowym tekstem odpowiedzi HTTP dla danego code.
James Coyle

78

Prosta jedna wkładka;

res.status(404).send("Oh uh, something went wrong");

20

Chciałbym scentralizować tworzenie odpowiedzi na błąd w ten sposób:

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})
});

Więc zawsze mam ten sam format wyjściowy błędów.

PS: oczywiście możesz utworzyć obiekt, aby rozszerzyć standardowy błąd w następujący sposób:

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

Możesz użyć res.send('OMG :(', 404);tylkores.send(404);


Ale chcę, aby kod błędu był wysyłany do oprogramowania pośredniczącego eventHandler, więc zostanie wyświetlona niestandardowa strona błędu Express.
tech-man

12
Dla każdego, kto czyta to w 2016 r .: zgodnie z Express 4.x res.send(404)jest przestarzały. Teraz jest res.sendStatus(404). expressjs.com/en/api.html#res.sendStatus
0xRm

12

W express 4.0 dobrze to zrozumieli :)

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

Wydaje się, że wersja oprogramowania pośredniego ErrorHandler dołączona do niektórych (być może starszych?) Wersji programu Express ma kod stanu na stałe. Wersja udokumentowana tutaj: http://www.senchalabs.org/connect/errorHandler.html z drugiej strony pozwala robić to, co próbujesz zrobić. Więc może próbując zaktualizować do najnowszej wersji express / connect.


9

Z tego, co widziałem w Express 4.0, działa to dla mnie. To jest przykład oprogramowania pośredniego wymagającego uwierzytelnienia.

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

Stare pytanie, ale wciąż pojawia się w Google. W aktualnej wersji Express (3.4.0) możesz zmienić res.statusCode przed wywołaniem next (err):

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

Co dalej?
Steve K

nextwywołuje następny program obsługi, który w express.js zwykle próbuje renderować strony błędów.
Kurotsuki

2

express deprecated res.send (treść, status). Zamiast tego użyj res.status (status) .send (body)


2

próbowałem

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

..ale dawało mi to błąd :

(węzeł: 208) UnhandledPromiseRejectionWarning: Error: Nie można ustawić nagłówków po ich wysłaniu.

Ta praca dla mnie

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.