Ich spiele mit Nodejs herum und drücke aus, indem ich eine kleine Rest-API baue. Meine Frage ist: Was ist die beste Methode, um den Code-Status sowie die Antwortdaten festzulegen?
Lassen Sie mich mit etwas Code erklären (ich werde nicht den Knoten und den Express-Code eingeben, der zum Starten des Servers erforderlich ist, sondern nur die Routermethoden, die betroffen sind):
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 und beim Senden einer Anfrage mit Postman erhalte ich folgendes Ergebnis:
Wie Sie sehen, zeigt der Status 200 an, was OK ist. Aber ist dies der beste Weg, dies zu tun? Gibt es einen Fall, in dem ich den Status sowie die zurückgegebene JSON selbst festlegen muss? Oder wird das immer per Express erledigt?
Zum Beispiel habe ich gerade einen Schnelltest gemacht und die get-Methode oben leicht geändert:
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, werde ich den Status 404 setzen, wenn der Benutzer nicht im Array gefunden wird.
Ressourcen/Ratschläge, um mehr über dieses Thema zu erfahren, sind mehr als willkommen.
Sie könnten es so machen:
res.status(400).json(json_response);
Dadurch wird der HTTP-Statuscode auf 400 gesetzt. Er funktioniert auch in Express 4.
der Status von 200 ist der Standardwert, wenn res.send
, res.json
usw. verwendet wird.
Sie können den Status wie res.status(500).json({ error: 'something is wrong' });
setzen.
Oft mache ich so etwas wie ...
router.get('/something', function(req, res, next) {
// Some stuff here
if(err) {
res.status(500);
return next(err);
}
// More stuff here
});
Lassen Sie dann meine Fehler-Middleware die Antwort senden und tun Sie alles, was ich tun muss, wenn ein Fehler auftritt.
Zusätzlich wurde res.sendStatus(status)
ab Version 4.9.0http://expressjs.com/4x/api.html#res.sendStatus hinzugefügt
Eine Liste von HTTP-Statuscodes
Die bewährte Vorgehensweise bei Statusantworten ist, voraussagbar 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 es sein um (erneut) den Status und die Daten als zwei verschiedene Eigenschaften des Wurzelobjekts 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 den Fehler im Fehlerfall auf eine für Menschen verständliche Weise erklärt.
Stripe's API verhält sich in der realen Welt ähnlich.
d.h.
OK
200, {status: 200, data: [...]}
Error
400, {status: 400, data: null, message: "You must send foo and bar to baz..."}
Ich verwende dies in meiner Express.js-Anwendung:
app.get('/', function (req, res) {
res.status(200).json({
message: 'Welcome to the project-name api'
});
});
res.status(500).jsonp(dataRes);
try {
var data = {foo: "bar"};
res.json(JSON.stringify(data));
}
catch (e) {
res.status(500).json(JSON.stringify(e));
}
Die Standardmethode, um vollständige HttpResponse-Funktion zu erhalten, die die folgenden Eigenschaften enthält
Tun Sie dies im Backend
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')
})
wenn Sie also in Angular
app empfangen möchten, machen Sie einfach folgendes:
this.http.post(`${this.domain}/signup`, { profile: data }, {
observe: 'response' // remember to add this, you'll get pure HttpResponse
}).subscribe(response => {
console.log(response)
})