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.

technik
źródło
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');
Dan Mandle
źródło
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");
Mike P
źródło
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);
Manuel Spigolon
źródło
16

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

Mustafa
źródło
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')
Steven Spungin
źródło
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.

catphive
źródło
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);
}
Ido Ran
źródło
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'));
webarnes
źródło
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)

Rajeev Jayaswal
źródło
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);
Tarun Rawat
źródło
0

Poleciłbym obsługę wysyłania kodów błędów http przy użyciu pakietu Boom .

JoeTidee
źródło