2012-05-12 28 views
74

Próbowałem:Jak określić kod błędu HTTP?

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

oraz:

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

ale zawsze kod błędu 500 jest ogłoszony.

+1

Moja odpowiedź na pokrewne pytanie może pomóc: http://stackoverflow.com/questions/10170857/can-i-reuse-the-express-js- error-view/10556093 # 10556093 – Pickels

+1

Czy możesz zaktualizować zaakceptowaną odpowiedź? –

Odpowiedz

141

Per wyraźnej (wersja 4+) docs, można 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'); 
+14

+1 za korzystanie z najnowszej wersji interfejsu API. Jeśli chcesz wysłać więcej dół drutu, tylko łańcuch: 'res.status (400) .json ({error:„wiadomość”})' – TyMayn

+0

A co jeśli nie mam zmienną odpowiedzi? W walidacji mangusty muszę wstawić błąd "done" (nowy błąd ("Mój tekst błędu")) ' – Mikel

+0

@Mikel, jeśli nie masz zmiennej odpowiedzi, wtedy nie możesz wysłać odpowiedzi. –

13

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

+0

Ale chcę, aby kod błędu został wysłany do oprogramowania pośredniczącego eventHandler, dlatego wyświetlana jest niestandardowa strona błędu ekspresowego. –

+6

Dla każdego, kto to czyta w 2016 roku: jak w Express 4.x, 'res.send (404)' jest przestarzałe. To teraz 'res.sendStatus (404)'. http://expressjs.com/en/api.html#res.sendStatus – 0xRm

11

The wersję oprogramowania pośredniczącego errorHandler pakiecie z niektórych (być może starszy?) Wersje express wydaje się, że kod stanu ustalony. Wersja opisana tutaj: http://www.senchalabs.org/connect/errorHandler.html z drugiej strony pozwala robić to, co próbujesz zrobić. Być może więc starasz się uaktualnić do najnowszej wersji express/connect.

8

Stare pytanie, ale wciąż pojawiające się w Google. W obecnej wersji Express (3.4.0) można zmieniać res.statusCode przed wywołaniem kolejnego (ERR):

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

Co dalej robić? – nottinhill

+0

'next' wywołuje następny handler, który w Express.js zwykle próbuje renderować strony błędów. – Kurotsuki

5

z tego co widziałem w ś ss 4.0 to działa dla mnie. To jest przykład wymaganego oprogramowania pośredniczącego do uwierzytelniania.

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

Prosta jedna wkładka;

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

W Express 4.0 dostali to dobrze :)

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

Chciałbym scentralizować tworzenie odpowiedzi błędu w następujący 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 mam zawsze ten sam format wyjściowy błędu.

PS: Oczywiście można utworzyć obiekt do extend the standard error tak:

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

wyraźnej przestarzałe res.send (ciało, status). Zamiast tego użyj opcji res.status (status) .send (body):

Powiązane problemy