110 votes

Comment envoyer un message d'état http personnalisé dans node / express ?

Mon application node.js est modélisée comme suit express/exemples/mvc app.

Dans une action de contrôleur, je veux renvoyer un statut HTTP 400 avec un message http personnalisé. Par défaut, le message d'état http est "Bad Request" :

HTTP/1.1 400 Bad Request

Mais je veux envoyer

HTTP/1.1 400 Current password does not match

J'ai essayé plusieurs méthodes, mais aucune d'entre elles n'a défini le message d'état http comme étant mon message personnalisé.

Ma fonction actuelle de contrôleur de solution ressemble à cela :

exports.check = function( req, res) {
  if( req.param( 'val')!=='testme') {
    res.writeHead( 400, 'Current password does not match', {'content-type' : 'text/plain'});
    res.end( 'Current value does not match');

    return;
  } 
  // ...
}

Tout fonctionne bien mais ... il semble que ce ne soit pas la bonne façon de faire.

Existe-t-il un meilleur moyen de définir le message d'état http en utilisant express ?

150voto

mamacdon Points 1379

Aucune des réponses existantes ne permet de réaliser ce que le PO a demandé à l'origine, c'est-à-dire de remplacer l'option par défaut. Raison-Phrase (le texte apparaissant immédiatement après le code d'état) envoyé par Express.

Ce que vous voulez, c'est res.statusMessage . Cela ne fait pas partie d'Express, c'est une propriété de l'objet sous-jacent http.Response dans Node.js 0.11+.

Vous pouvez l'utiliser comme ceci (testé dans Express 4.x) :

function(req, res) {
    res.statusMessage = "Current password does not match";
    res.status(400).end();
}

Ensuite, utilisez curl pour vérifier qu'il fonctionne :

$ curl -i -s http://localhost:3100/
HTTP/1.1 400 Current password does not match
X-Powered-By: Express
Date: Fri, 08 Apr 2016 19:04:35 GMT
Connection: keep-alive
Content-Length: 0

73voto

Peter Gerasimenko Points 1830

Vous pouvez vérifier ceci res.send(400, 'Current password does not match') Regardez docs express 3.x pour plus de détails

Mise à jour pour Expressjs 4.x

Utilisez cette méthode (regardez docs express 4.x ) :

res.status(400).send('Current password does not match');
// or
res.status(400);
res.send('Current password does not match');

13voto

Manoj Ojha Points 239

Vous pouvez l'utiliser comme suit

return res.status(400).json({'error':'User already exists.'});

12voto

hunterloftis Points 2956

Une façon élégante de gérer les erreurs personnalisées comme celle-ci dans express est :

function errorHandler(err, req, res, next) {
  var code = err.code;
  var message = err.message;
  res.writeHead(code, message, {'content-type' : 'text/plain'});
  res.end(message);
}

(vous pouvez également utiliser la fonction intégrée d'express express.errorHandler pour cela)

Puis dans votre intergiciel, avant vos routes :

app.use(errorHandler);

Ensuite, où vous voulez créer l'erreur "Le mot de passe actuel ne correspond pas" :

function checkPassword(req, res, next) {
  // check password, fails:
  var err = new Error('Current password does not match');
  err.code = 400;
  // forward control on to the next registered error handler:
  return next(err);
}

11voto

chotesah Points 11

Du côté du serveur (Express middleware) :

if(err) return res.status(500).end('User already exists.');

Traitement du côté client

Angular:-

$http().....
.error(function(data, status) {
  console.error('Repos error', status, data);//"Repos error" 500 "User already exists."
});

jQuery:-

$.ajax({
    type: "post",
    url: url,
    success: function (data, text) {
    },
    error: function (request, status, error) {
        alert(request.responseText);
    }
});

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