221 votes

Comment spécifier le code d'erreur HTTP en utilisant Express.js ?

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 votes

Ma réponse à une question connexe pourrait vous aider : stackoverflow.com/questions/10170857/

2 votes

Pourriez-vous mettre à jour la réponse acceptée ?

0 votes

378voto

Dan Mandle Points 3057

Selon la documentation d'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');

55 votes

+1 pour l'utilisation de la dernière version de l'API. Si vous voulez en envoyer plus sur le fil, il suffit d'envoyer une chaîne : res.status(400).json({ error: 'message' })

0 votes

Et si je n'ai pas de variable de réponse ? Dans une validation Mongoose, je dois faire apparaître une erreur. done(new Error('My error text'))

1 votes

@Mikel si vous n'avez pas de variable de réponse, alors vous ne pouvez pas envoyer de réponse.

102voto

Mike P Points 678

Une simple phrase ;

res.status(404).send("Oh uh, something went wrong");

34voto

Manuel Spigolon Points 1333

J'aimerais 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 pourriez créer un objet pour étendre l'erreur standard comme ça :

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

0 votes

Excellente solution mais cela me donne une erreur UnhandledPromiseRejectionWarning. Comment s'assurer que les erreurs sont traitées dans notre middleware d'erreur ?

0 votes

Async/await n'est pas supporté tel quel par express, essayez ceci github.com/fastify/fastify

19voto

Mustafa Points 2782

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

1 votes

Mais je veux que le code d'erreur soit envoyé au middleware eventHandler, afin que la page d'erreur personnalisée de l'express soit affichée.

15 votes

Pour tous ceux qui lisent ceci en 2016 : Comme pour Express 4.x, res.send(404) est déprécié. C'est maintenant res.sendStatus(404) . expressjs.com/fr/api.html#res.sendStatus

17voto

Steven Spungin Points 5660

Dans l'express 4.0, ils ont bien fait les choses :)

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X