Wie kann man einen HTTP-Fehlercode angeben?

161

Ich habe versucht:

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

und:

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

Es wird jedoch immer ein Fehlercode von 500 angekündigt.

Techniker
quelle
1
Meine Antwort auf eine verwandte Frage könnte helfen: stackoverflow.com/questions/10170857/…
Pickels
2
Könnten Sie bitte die akzeptierte Antwort aktualisieren?
Dan Mandle

Antworten:

293

In den Express-Dokumenten (Version 4+) können Sie Folgendes verwenden:

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
quelle
37
+1 für die Verwendung der neuesten Version der API. Wenn Sie mehr über den Draht senden möchten, res.status(400).json({ error: 'message' })
verketten Sie
1
@Mikel Wenn Sie keine Antwortvariable haben, können Sie keine Antwort senden.
Dan Mandle
1
Dies ist alles veraltet, sollten Sie verwenden res.sendStatus(401);.
Cipi
1
Diese Antwort wäre viel vollständiger, wenn sie mit enden würde res.send('Then you shall die').
goodvibration
1
@Cipi Hast du eine Quelle dafür? Die Dokumentation zeigt nicht an, dass sie .status()veraltet ist. .sendStatus()ist nur eine Abkürzung für , .status(code).send(codeName)wo die codeNameStandard - HTTP - Antworttext für die angegebene ist code.
James Coyle
78

Ein einfacher Einzeiler;

res.status(404).send("Oh uh, something went wrong");
Mike P.
quelle
20

Ich möchte die Erstellung der Fehlerantwort folgendermaßen zentralisieren:

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

Ich habe also immer das gleiche Fehlerausgabeformat.

PS: Natürlich können Sie ein Objekt erstellen, um den Standardfehler wie folgt zu erweitern :

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
quelle
16

Sie können res.send('OMG :(', 404);nur verwendenres.send(404);

Mustafa
quelle
Ich möchte jedoch, dass der Fehlercode an die eventHandler-Middleware gesendet wird, damit die benutzerdefinierte Fehlerseite von Express angezeigt wird.
Techniker
12
Für alle, die dies 2016 lesen: Gemäß Express 4.x res.send(404)ist es veraltet. Es ist jetzt res.sendStatus(404). expressjs.com/en/api.html#res.sendStatus
0xRm
12

In Express 4.0 haben sie es richtig gemacht :)

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
quelle
11

Die Version der errorHandler-Middleware, die mit einigen (möglicherweise älteren?) Express-Versionen gebündelt ist, scheint den Statuscode fest codiert zu haben. Mit der hier dokumentierten Version: http://www.senchalabs.org/connect/errorHandler.html können Sie dagegen das tun, was Sie versuchen. Versuchen Sie also vielleicht, ein Upgrade auf die neueste Version von Express / Connect durchzuführen.

Catphive
quelle
9

Nach dem, was ich in Express 4.0 gesehen habe, funktioniert dies für mich. Dies ist ein Beispiel für die für die Authentifizierung erforderliche Middleware.

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
quelle
8

Alte Frage, aber immer noch bei Google. In der aktuellen Version von Express (3.4.0) können Sie res.statusCode ändern, bevor Sie next (err) aufrufen:

res.statusCode = 404;
next(new Error('File not found'));
Webarnes
quelle
Was macht als nächstes?
Steve K
nextruft den nächsten Handler auf, der in express.js normalerweise versucht, Fehlerseiten zu rendern.
Kurotsuki
2

veraltete res.send ausdrücken (body, status). Verwenden Sie stattdessen res.status (status) .send (body)

Rajeev Jayaswal
quelle
2

Ich habe es versucht

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

..aber es gab mir Fehler :

(Knoten: 208) UnhandledPromiseRejectionWarning: Fehler: Header können nach dem Senden nicht festgelegt werden.

Diese Arbeit für mich

res.status(400).send(yourMessage);
Tarun Rawat
quelle
0

Ich würde empfehlen, das Senden von http-Fehlercodes mithilfe des Boom- Pakets zu behandeln.

JoeTidee
quelle