2012-05-12 16 views
74

Ich habe versucht:Wie wird der HTTP-Fehlercode angegeben?

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

aber immer wird ein Fehlercode von 500 angekündigt.

+1

Meine Antwort auf eine verwandte Frage könnte helfen: http://stackoverflow.com/questions/10170857/cani-ireuse-the-express-js- error-view/10556093 # 10556093 – Pickels

+1

Könnten Sie bitte die akzeptierte Antwort aktualisieren? –

Antwort

141

Per dem Express (Version 4+) docs, können Sie 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'); 
+14

+1 für die Verwendung der neuesten Version der API. Wenn Sie mehr auf dem Draht senden möchten, einfach Kette: 'res.status (400) .json ({Fehler: 'Nachricht'})' – TyMayn

+0

Was ist, wenn ich keine Antwortvariable habe? In einer Mungo-Validierung muss ich einen Fehler "fertig" (Neuer Fehler ('Mein Fehlertext')) ' – Mikel

+0

@Mikel, wenn Sie keine Antwort-Variable haben, dann können Sie keine Antwort gesendet. –

13

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

+0

Aber ich möchte, dass der Fehlercode an eventHandler Middleware gesendet wird, damit die benutzerdefinierte Fehlerseite angezeigt wird. –

+6

Für alle, die das 2016 lesen: Gemäß Response 4.x ist 'res.send (404)' veraltet. Es ist jetzt 'res.sendStatus (404)'. http://expressjs.com/en/api.html#res.sendStatus – 0xRm

11

Die Version der Middleware mit einigen errorhandler gebündelt (vielleicht älter?) Versionen express scheint hartkodierte der Statuscode zu haben. Die Version, die hier dokumentiert ist: http://www.senchalabs.org/connect/errorHandler.html auf der anderen Seite können Sie tun, was Sie versuchen zu tun. Versuchen Sie vielleicht, auf die neueste Version von express/connect zu aktualisieren.

8

Alte Frage, aber immer noch auf Google kommen. In der aktuellen Version von Express (3.4.0), können Sie res.statusCode vor dem Aufruf von next (err) ändern:

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

Was macht als nächstes? – nottinhill

+0

'next' ruft den nächsten Handler auf, der in express.js normalerweise versucht, Fehlerseiten zu rendern. – Kurotsuki

5

Von dem, was ich sah, in Expre ss 4.0 das funktioniert für mich. Dies ist ein Beispiel für die Authentifizierung erforderlicher 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); 
} 
45

Ein einfacher Liner;

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

In Express 4.0 bekam sie es richtig :)

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') 
3

Ich möchte die Erstellung der Fehlerreaktion auf diese Weise 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}) 
}); 

So habe ich immer das gleiche Fehlerausgabeformat.

PS: natürlich ein Objekt zu extend the standard error wie dies schaffen könnte:

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

express veraltet res.send (Körper, Status). Verwenden Sie res.status (Status) .send (Körper) stattdessen

Verwandte Themen