¿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.


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

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

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

16

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


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

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.


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

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

¿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


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

0

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.