2012-05-12 10 views
74

que he intentado:Cómo especificar un código de error HTTP?

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

y:

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

pero siempre se anunció un código de error 500.

+1

Mi respuesta a una pregunta relacionada podría ayudar: http://stackoverflow.com/questions/10170857/can-i-reuse-the-express-js- error-view/10556093 # 10556093 – Pickels

+1

¿Podría actualizar la respuesta aceptada? –

Respuesta

141

por el Express (versión 4) documentos, puede utilizar:

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 para usar la última versión de la API. Si desea enviar más por el cable, solo cadena: 'res.status (400) .json ({error: 'mensaje'})' – TyMayn

+0

¿Qué pasa si no tengo una variable de respuesta? En una validación de mangosta, tengo que levantar un error 'hecho (nuevo Error ('Mi texto de error'))' – Mikel

+0

@Mikel si no tiene una variable de respuesta, entonces no puede enviar una respuesta. –

13

Puede utilizar res.send('OMG :(', 404); simplemente res.send(404);

+0

Pero quiero que se envíe el código de error al middleware eventHandler, para que se muestre la página de error personalizada de express. –

+6

Para cualquiera que lea esto en 2016: según Express 4.x, 'res.send (404)' está en desuso. Ahora es 'res.sendStatus (404)'. http://expressjs.com/en/api.html#res.sendStatus – 0xRm

11

La versión del middleware errorHandler suministra con algunos (tal vez más?) Versiones de expreso parece tener el código de estado codificada. La versión documentada aquí: http://www.senchalabs.org/connect/errorHandler.html, por otro lado, le permite hacer lo que está tratando de hacer. Entonces, quizás intente actualizar a la última versión de express/connect.

8

Pregunta anterior, pero sigue apareciendo en Google. En la versión actual de Express (3.4.0), puede alterar res.statusCode antes de llamar al lado (err):

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

¿Qué es lo siguiente que hace? – nottinhill

+0

'next' está llamando al siguiente controlador que en express.js normalmente está tratando de mostrar páginas de error. – Kurotsuki

5

por lo que vi en Expre ss 4.0 esto funciona para mí. Este es un ejemplo de middleware requerido de autenticación.

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

A simple one liner;

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

En Express 4.0 que lo hizo bien :)

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

me gustaría centralizar la creación de la respuesta de error de esta manera:

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

Así que siempre tienen el mismo formato de salida de error.

PD: por supuesto, se podría crear un objeto a extend the standard error así:

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

expresa y obsoleta res.send (corporal, estado). Usar res.status (estado) .send (cuerpo) en su lugar

Cuestiones relacionadas