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.