Ich spiele mit Nodejs herum und drücke es aus, indem ich eine kleine Rest-API erstelle. Meine Frage ist, was ist die bewährte Methode / der beste Weg, um den Codestatus sowie die Antwortdaten festzulegen?
Lassen Sie mich dies mit ein wenig Code erklären (ich werde nicht den Knoten und den zum Starten des Servers erforderlichen Code ausdrücken, sondern nur die betreffenden Routermethoden):
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];
}
};
Der folgende Code funktioniert einwandfrei. Wenn ich eine Anfrage mit Postman sende, erhalte ich das folgende Ergebnis:
Wie Sie sehen können, zeigt der Status 200 an, was in Ordnung ist. Aber ist das der beste Weg, dies zu tun? Gibt es einen Fall, in dem ich den Status sowie den zurückgegebenen JSON selbst festlegen muss? Oder wird das immer per Express erledigt?
Zum Beispiel habe ich gerade einen Schnelltest durchgeführt und die obige Methode get leicht modifiziert:
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);
});
Wie Sie sehen können, setze ich nur den Status 404, wenn der Benutzer nicht im Array gefunden wird.
Ressourcen / Ratschläge, um mehr über dieses Thema zu erfahren, sind mehr als willkommen.
Antworten:
Die Express-API-Referenz deckt diesen Fall ab.
Siehe Status und senden .
Kurz gesagt, Sie müssen die
status
Methode nur aufrufen , bevor Sie aufrufen,json
odersend
:quelle
res.sendStatus(400);
res.sendStatus(400);
senden Sie auch eine Zeichenfolge Daten, entsprichtres.status(400).send('Not Found')
Sie könnten es so machen:
Dadurch wird der HTTP-Statuscode auf 400 gesetzt, dies funktioniert sogar in Express 4.
quelle
express deprecated res.json(status, obj): Use res.status(status).json(obj) instead
Also,res.status(400).json(json_response)
wäre heutzutage genau.res.status(500).send({ error: "boo:(" });
Status 200 wird der Standard sein bei der Verwendung
res.send
,res.json
etc.Sie können den Status wie einstellen
res.status(500).json({ error: 'something is wrong' });
Oft mache ich so etwas wie ...
Lassen Sie dann meine Fehler-Middleware die Antwort senden und alles andere tun, was ich tun muss, wenn ein Fehler auftritt.
Zusätzlich:
res.sendStatus(status)
wurde ab Version hinzugefügt 4.9.0 http://expressjs.com/4x/api.html#res.sendStatusquelle
Eine Liste der HTTP-Statuscodes
Die bewährte Methode für die Statusantwort besteht darin, vorhersehbar den richtigen HTTP-Statuscode in Abhängigkeit vom Fehler zu senden (4xx für Clientfehler, 5xx für Serverfehler). In Bezug auf die tatsächliche JSON-Antwort gibt es keine "Bibel", aber eine gute Idee könnte sein (erneut) den Status und die Daten als 2 verschiedene Eigenschaften des Stammobjekts in einer erfolgreichen Antwort zu senden (auf diese Weise geben Sie dem Client die Möglichkeit, den Status aus den HTTP-Headern und der Nutzlast selbst zu erfassen ) und eine dritte Eigenschaft, die das erklärt Fehler auf menschlich verständliche Weise im Fehlerfall.
Die API von Stripe verhält sich in der realen Welt ähnlich.
dh
OK
Error
quelle
Ich verwende dies in meiner Express.js-Anwendung:
quelle
Die Standardmethode zum Abrufen einer vollständigen HttpResponse mit den folgenden Eigenschaften
Auf Backend , dies zu tun
Am Frontend zB in
Angular
, einfach:quelle
quelle
quelle
Du könntest das tun
quelle
Der beste Weg, eine Fehlerantwort zu senden, wäre
return res.status(400).send({ message: 'An error has occurred' })
.Dann können Sie es in Ihrem Frontend mit so etwas abfangen:
Nur die Protokollierung
err
funktioniert nicht, da sich Ihr gesendetes Nachrichtenobjekt in befindeterr.response.data
.Hoffentlich hilft das!
quelle