it-swarm.com.de

Richtiger Weg, um den Antwortstatus und den JSON-Inhalt in a festzulegen REST API mit nodejs und express erstellt

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: enter image description here

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.

122
dukable

Die Express-API-Referenz deckt diesen Fall ab.

Siehe status und send .

Kurz gesagt, Sie müssen nur die status-Methode aufrufen, bevor Sie json oder send aufrufen:

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

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.

56
mzalazar

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

32
Jordonias

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..."}
17
cmlndz

Ich verwende dies in meiner Express.js-Anwendung:

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

Die Standardmethode, um vollständige HttpResponse-Funktion zu erhalten, die die folgenden Eigenschaften enthält

  1. body // enthält Ihre Daten
  2. Überschriften
  3. oK
  4. status
  5. statusText
  6. art
  7. url

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)
})
0
WasiF