web-dev-qa-db-fra.com

Moyen approprié de définir l’état de la réponse et le contenu JSON dans un REST API faite avec nodejs et express

Je joue avec Nodejs et exprime en construisant une petite API de repos. Ma question est la suivante: quelle est la bonne pratique/la meilleure façon de définir le statut du code, ainsi que les données de réponse?

Laissez-moi vous expliquer avec un peu de code (je ne vais pas mettre le nœud et exprimer le code nécessaire pour démarrer le serveur, juste les méthodes de routeur qui sont concernées):

router.get('/users/:id', function(req, res, next) {
  var user = users.getUserById(req.params.id);
  res.json(user);
});


exports.getUserById = function(id) {
  for (var i = 0; i < users.length; i++) {
    if (users[i].id == id) return users[i];
  }
};

Le code ci-dessous fonctionne parfaitement et lors de l'envoi d'une requête avec Postman, j'obtiens le résultat suivant: enter image description here

Comme vous pouvez le constater, le statut indique 200, ce qui est OK. Mais est-ce la meilleure façon de faire cela? Existe-t-il un cas où je devrais définir le statut moi-même, ainsi que le code JSON renvoyé? Ou est-ce toujours traité par exprès?

Par exemple, je viens de faire un test rapide et légèrement modifié la méthode get ci-dessus:

router.get('/users/:id', function(req, res, next) {
  var user = users.getUserById(req.params.id);
  if (user == null || user == 'undefined') {
    res.status(404);
  }
  res.json(user);
});

Comme vous pouvez le constater, si l'utilisateur ne figure pas dans le tableau, je définirai simplement un statut de 404.

Des ressources/conseils pour en savoir plus sur ce sujet sont les bienvenus.

122
dukable

La référence Express API couvre ce cas.

Voir status et send .

En bref, vous devez simplement appeler la méthode status avant d'appeler json ou send:

res.status(500).send({ error: "boo:(" });
157
Michał Dudak

Vous pouvez le faire de cette façon:

res.status(400).json(json_response);

Cela définira le code de statut HTTP sur 400, cela fonctionnera même dans express 4.

56
mzalazar

le statut 200 sera la valeur par défaut lors de l'utilisation de res.send, res.json, etc.

Vous pouvez définir le statut comme res.status(500).json({ error: 'something is wrong' });

Souvent, je fais quelque chose comme ...

router.get('/something', function(req, res, next) {
  // Some stuff here
  if(err) {
    res.status(500);
    return next(err);
  }
  // More stuff here
});

Ensuite, mon middleware d'erreur envoie la réponse et faites tout ce que je dois faire en cas d'erreur.

De plus: res.sendStatus(status) a été ajouté à partir de la version 4.9.0http://expressjs.com/4x/api.html#res.sendStatus

32
Jordonias

Une liste de Codes de statut HTTP

La bonne pratique en matière de réponse d'état consiste à envoyer, de manière prévisible, le code d'état HTTP approprié en fonction de l'erreur (4xx pour les erreurs client, 5xx pour les erreurs serveur), en ce qui concerne la réponse JSON réelle, il n'y a pas de "bible" mais une bonne idée pourrait être pour envoyer (à nouveau) le statut et les données sous forme de 2 propriétés différentes de l'objet racine dans une réponse réussie (de cette manière, vous donnez au client la possibilité de capturer le statut à partir des en-têtes HTTP et le contenu lui-même) et une 3ème propriété expliquant l'erreur d'une manière compréhensible pour l'homme dans le cas d'une erreur.

Stripe's API se comporte de la même manière dans le monde réel.

c'est à dire.

D'ACCORD

200, {status: 200, data: [...]}

Erreur

400, {status: 400, data: null, message: "You must send foo and bar to baz..."}
17
cmlndz

J'utilise ceci dans mon application Express.js:

app.get('/', function (req, res) {
    res.status(200).json({
        message: 'Welcome to the project-name api'
    });
});
11
mrks
res.status(500).jsonp(dataRes);
2
Gustavo Grisales
try {
  var data = {foo: "bar"};
  res.json(JSON.stringify(data));
}
catch (e) {
  res.status(500).json(JSON.stringify(e));
}
1
Sma Ma

La méthode standard pour obtenir une réponse HttpResponse complète incluant les propriétés suivantes

  1. body // contient vos données
  2. en-têtes
  3. d'accord
  4. statut
  5. statusText
  6. type
  7. url

Sur le backend, faites ceci

router.post('/signup', (req, res, next) => {
    // res object have its own statusMessage property so utilize this
    res.statusMessage = 'Your have signed-up succesfully'
    return res.status(200).send('You are doing a great job')
})

si vous souhaitez recevoir, c'est-à-dire dans l'application Angular, procédez comme suit: 

this.http.post(`${this.domain}/signup`, { profile: data }, {
    observe: 'response' // remember to add this, you'll get pure HttpResponse
}).subscribe(response => {
    console.log(response)
})
0
WasiF