¿Cómo especificar el código de error HTTP?

161

Yo he tratado:

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 anuncia un código de error de 500.

hombre de tecnología
fuente
1
Mi respuesta a una pregunta relacionada podría ayudar: stackoverflow.com/questions/10170857/…
Pickels
2
¿Podría por favor actualizar la respuesta aceptada?
Dan Mandle

Respuestas:

293

Según los documentos Express (Versión 4+), puede usar:

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
fuente
37
+1 por usar la última versión de la API. Si desea enviar más por el cable, simplemente res.status(400).json({ error: 'message' })
encadene
1
@Mikel si no tiene una variable de respuesta, entonces no puede enviar una respuesta.
Dan Mandle
1
Todo esto está en desuso ahora, deberías usarlo res.sendStatus(401);.
Cipi
1
Esta respuesta sería mucho más completa si terminara con res.send('Then you shall die').
goodvibration
1
@Cipi ¿Tienes una fuente para eso? La documentación no indica que .status()está en desuso. .sendStatus()es solo una abreviatura de .status(code).send(codeName)dónde codeNameestá el texto de respuesta HTTP estándar para el dado code.
James Coyle
78

Un simple trazador de líneas;

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

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 tengo el mismo formato de salida de error.

PD: por supuesto, podría crear un objeto para extender el error estándar como este:

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

Puedes usar res.send('OMG :(', 404);solores.send(404);

Mustafa
fuente
Pero quiero que el código de error se envíe al middleware eventHandler, por lo que se mostrará la página de error personalizada de express.
tech-man
12
Para cualquiera que lea esto en 2016: según Express 4.x, res.send(404)está en desuso. Es ahora res.sendStatus(404). expressjs.com/en/api.html#res.sendStatus
0xRm
12

En express 4.0 lo hicieron 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')
Steven Spungin
fuente
11

La versión del middleware errorHandler incluido con algunas (¿quizás más antiguas?) De express parece tener el código de estado codificado. 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.

catphive
fuente
9

Por lo que vi en Express 4.0, esto funciona para mí. Este es un ejemplo de autenticación que requiere 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
fuente
8

Antigua pregunta, pero aún aparece en Google. En la versión actual de Express (3.4.0), puede alterar res.statusCode antes de llamar a next (err):

res.statusCode = 404;
next(new Error('File not found'));
webarnes
fuente
¿Qué es lo siguiente que hace?
Steve K
nextestá llamando al siguiente controlador que en express.js generalmente está tratando de representar páginas de error.
Kurotsuki
2

express res.send en desuso (cuerpo, estado). Utilice res.status (estado) .send (cuerpo) en su lugar

Rajeev Jayaswal
fuente
2

Lo intenté

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

... pero me estaba dando un error :

(nodo: 208) UnhandledPromiseRejectionWarning: Error: No se pueden establecer encabezados después de enviarlos.

Este trabajo para mi

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

Recomendaría manejar el envío de códigos de error http utilizando el paquete Boom .

JoeTidee
fuente