Comment spécifier le code d'erreur HTTP?

161

J'ai essayé:

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

et:

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

mais toujours un code d'erreur de 500 est annoncé.

technicien
la source
1
Ma réponse à une question connexe pourrait aider: stackoverflow.com/questions/10170857/…
Pickels
2
Pourriez-vous mettre à jour la réponse acceptée?
Dan Mandle

Réponses:

293

Selon la documentation Express (version 4+), vous pouvez utiliser:

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
la source
37
+1 pour l'utilisation de la dernière version de l'API. Si vous voulez en envoyer plus sur le fil, enchaînez simplement:res.status(400).json({ error: 'message' })
TyMayn
1
@Mikel si vous n'avez pas de variable de réponse, vous ne pouvez pas envoyer de réponse.
Dan Mandle
1
Tout cela est maintenant obsolète, vous devriez utiliser res.sendStatus(401);.
Cipi
1
Cette réponse serait beaucoup plus complète si elle se terminait par res.send('Then you shall die').
goodvibration
1
@Cipi Avez-vous une source pour ça? La documentation n'indique pas qu'elle .status()est obsolète. .sendStatus()est juste un raccourci pour .status(code).send(codeName)où le codeNameest le texte de réponse HTTP standard pour le donné code.
James Coyle
78

Une simple doublure;

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

Je souhaite centraliser la création de la réponse d'erreur de cette manière:

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

J'ai donc toujours le même format de sortie d'erreur.

PS: bien sûr, vous pouvez créer un objet pour étendre l'erreur standard comme ceci:

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
la source
16

Vous pouvez utiliser res.send('OMG :(', 404);justeres.send(404);

Mustafa
la source
Mais je veux que le code d'erreur soit envoyé au middleware eventHandler, afin que la page d'erreur personnalisée d'Express soit affichée.
tech-man
12
Pour tous ceux qui liront ceci en 2016: selon Express 4.x, res.send(404)est obsolète. C'est maintenant res.sendStatus(404). expressjs.com/en/api.html#res.sendStatus
0xRm
12

Dans Express 4.0, ils ont bien compris :)

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
la source
11

La version du middleware errorHandler fournie avec certaines versions (peut-être plus anciennes?) D'Express semble avoir le code d'état codé en dur. La version documentée ici: http://www.senchalabs.org/connect/errorHandler.html vous permet en revanche de faire ce que vous essayez de faire. Alors, essayez peut-être de passer à la dernière version d'express / connect.

catphive
la source
9

D'après ce que j'ai vu dans Express 4.0, cela fonctionne pour moi. Ceci est un exemple d'intergiciel requis pour l'authentification.

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
la source
8

Ancienne question, mais toujours à venir sur Google. Dans la version actuelle d'Express (3.4.0), vous pouvez modifier res.statusCode avant d'appeler next (err):

res.statusCode = 404;
next(new Error('File not found'));
Webarnes
la source
Que fait ensuite?
Steve K
nextappelle le prochain gestionnaire qui dans express.js essaie généralement de rendre les pages d'erreur.
Kurotsuki
2

express res.send obsolète (corps, statut). Utilisez plutôt res.status (status) .send (body)

Rajeev Jayaswal
la source
2

j'ai essayé

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

..mais cela me donnait une erreur :

(nœud: 208) UnhandledPromiseRejectionWarning: Erreur: impossible de définir les en-têtes après leur envoi.

Ce travail pour moi

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

Je recommanderais de gérer l'envoi des codes d'erreur http en utilisant le package Boom .

JoeTidee
la source