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


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

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

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

16

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


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

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.


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

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

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)


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

0

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.