Je joue avec Nodejs et j'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 mettrai pas le nœud et le code express nécessaire pour démarrer le serveur, juste les méthodes de routage 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 demande avec Postman, j'obtiens le résultat suivant:
Comme vous pouvez le voir, l'état indique 200, ce qui est OK. Mais est-ce la meilleure façon de procéder? Y a-t-il un cas où je devrais devoir définir le statut moi-même, ainsi que le JSON renvoyé? Ou est-ce toujours géré par express?
Par exemple, je viens de faire un test rapide et j'ai 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 voir, si l'utilisateur n'est pas trouvé dans le tableau, je vais simplement définir un statut de 404.
Les ressources / conseils pour en savoir plus sur ce sujet sont plus que bienvenus.
Réponses:
La référence de l'API Express couvre ce cas.
Voir l' état et envoyer .
En bref, il vous suffit d'appeler la
status
méthode avant d'appelerjson
ousend
:la source
res.sendStatus(400);
res.sendStatus(400);
envoie également une chaîne de données, équivaut àres.status(400).send('Not Found')
Vous pouvez le faire de cette façon:
Cela définira le code d'état HTTP sur 400, cela fonctionne même dans express 4.
la source
express deprecated res.json(status, obj): Use res.status(status).json(obj) instead
Donc, ceres.status(400).json(json_response)
serait exact de nos jours.res.status(500).send({ error: "boo:(" });
état de 200 sera la valeur par défaut lors de l' utilisation
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 ...
Ensuite, demandez à mon middleware d'erreur d'envoyer la réponse et de faire tout ce que je dois faire en cas d'erreur.
De plus:
res.sendStatus(status)
a été ajouté à partir de la version 4.9.0 http://expressjs.com/4x/api.html#res.sendStatusla source
Une liste de codes d'état HTTP
La bonne pratique concernant la réponse d'état est, de manière prévisible, d'envoyer 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) l'état et les données comme 2 propriétés différentes de l'objet racine dans une réponse réussie (de cette façon, vous donnez au client la possibilité de capturer l'état à partir des en-têtes HTTP et de la charge utile elle-même) et une 3ème propriété expliquant le erreur d'une manière compréhensible par l'homme en cas d'erreur.
L' API de Stripe se comporte de la même manière dans le monde réel.
c'est à dire
D'accord
Erreur
la source
J'utilise ceci dans mon application Express.js:
la source
La manière standard d'obtenir HttpResponse complète qui inclut les propriétés suivantes
Sur le backend , faites ceci
Sur Frontend par exemple dans
Angular
, faites simplement:la source
la source
la source
Tu pourrais faire ça
la source
La meilleure façon d'envoyer une réponse d'erreur serait
return res.status(400).send({ message: 'An error has occurred' })
.Ensuite, dans votre frontend, vous pouvez l'attraper en utilisant quelque chose comme ceci:
La simple journalisation
err
ne fonctionnera pas, car votre objet de message envoyé réside danserr.response.data
.J'espère que cela pourra aider!
la source