Unterschied zwischen res.send und res.json in Express.js

200

Was ist der tatsächliche Unterschied zwischen res.sendund res.jsonwie beide scheinen die gleiche Operation der Antwort auf den Client auszuführen.

brg
quelle
72
Nehmen Sie sich einen Moment Zeit, um festzustellen, wie die Leute, die Antworten gepostet haben, einfach zu Github gegangen sind und den Quellcode gelesen haben. Dies ist eine gute Angewohnheit zu lernen und zu etablieren. Die Wahrheit liegt in der Quelle.
Peter Lyons
30
@PeterLyons Ich stimme zu, dass dies eine gute Angewohnheit ist, aber meinten Sie, dass RAM auf die Quelle hätte schauen sollen, anstatt die Frage zu stellen? Besiegt dies nicht den Zweck dieser Website? Das Vorhandensein dieser Frage mit Antworten auf eine gute Quelle (The Source!) Ist nützlich.
LinusR
3
Ja, lehre einen Mann das Fischen und alles.
Peter Lyons
71
Wenn uns "RTFS" (Read The Source) mitgeteilt wird, bedeutet dies tatsächlich, dass die Dokumente nicht kommunizieren, was sie sollten. Ja, wenn wir die Quelle haben, können wir sie überprüfen, aber man sollte nicht darauf zugreifen müssen, außer in dunklen Fällen. Alle diese Express-Funktionen sind wirklich großartig, aber die Dokumente sind um einiges zu kurz. SO ist voller Fragen zu Express-Dingen, die die Leute aus den Dokumenten nicht verstehen können (passiert mir).
Juan Lanus
3
Manchmal reicht die Lesequelle nicht aus, und da sich aus den Antworten eine gute Erklärung ergeben kann, wird dies das beste Verständnis des betreffenden Konzepts gewährleisten. Einige Leute würden einfach die Quelle lesen und verstehen, aber was ist mit Anfängern, die nicht unbedingt Javascript-freundlich sind? Denk darüber nach.
Cram2208

Antworten:

210

Die Methoden sind identisch, wenn ein Objekt oder Array übergeben wird, res.json()konvertieren jedoch auch Nichtobjekte wie nullund undefined, die kein gültiges JSON sind.

Die Methode verwendet auch die Einstellungen json replacerund und json spaces, sodass Sie JSON mit mehr Optionen formatieren können. Diese Optionen sind wie folgt eingestellt:

app.set('json spaces', 2);
app.set('json replacer', replacer);

Und JSON.stringify()so weitergereicht:

JSON.stringify(value, replacer, spacing);
// value: object to format
// replacer: rules for transforming properties encountered during stringifying
// spacing: the number of spaces for indentation

Dies ist der Code in der res.json()Methode, den die Sendemethode nicht hat:

var app = this.app;
var replacer = app.get('json replacer');
var spaces = app.get('json spaces');
var body = JSON.stringify(obj, replacer, spaces);

Die Methode endet res.send()am Ende als:

this.charset = this.charset || 'utf-8';
this.get('Content-Type') || this.set('Content-Type', 'application/json');

return this.send(body);
Hexacyanid
quelle
16

In den gesendeten Headern
suchen ... res.send verwendet den Inhaltstyp: text / html
res.json verwendet den Inhaltstyp: application / json

technischer Kerl
quelle
0

res.jsonerzwingt das Argument zu JSON. res.sendnimmt ein Nicht-JSON-Objekt oder -Array und sendet einen anderen Typ. Beispielsweise:

Dies gibt eine JSON-Nummer zurück.

res.json(100)

Dies gibt einen Statuscode zurück und gibt eine Warnung zur Verwendung von sendStatus aus.

res.send(100)

Wenn Ihr Argument kein JSON-Objekt oder -Array ist (null, undefiniert, boolesch, Zeichenfolge) und Sie sicherstellen möchten, dass es als JSON gesendet wird, verwenden Sie res.json.

Steven Spungin
quelle