Differenza tra res.send e res.json in Express.js


200

Qual è la differenza effettiva tra res.sende res.jsoncome entrambi sembra eseguire la stessa operazione di risposta al client.


73
Prenditi un momento per notare come le persone che hanno pubblicato le risposte sono appena andate su github e hanno letto il codice sorgente. Questa è una buona abitudine da imparare e stabilire. La verità sta nella fonte.
Peter Lyons,

31
@PeterLyons Sono d'accordo che questa è una buona abitudine, ma intendevi dire che Ram avrebbe dovuto guardare la fonte invece di porre la domanda? Questo non sconfigge lo scopo di questo sito? La presenza di questa domanda, con le risposte che si riferiscono a una buona fonte (The Source!) È utile.
Linus R

3
Sì, insegna a un uomo a pescare e tutto il resto.
Peter Lyons,

71
Quando ci viene detto "RTFS" (Leggi la fonte), in realtà significa che i documenti non riescono a comunicare ciò che dovrebbero. Sì, avere la fonte ci consente di controllarla, ma non è necessario accedervi se non in casi oscuri. Tutte queste funzionalità di Express sono davvero fantastiche, ma i documenti non sono all'altezza. SO è pieno di domande su cose di Express che le persone non possono capire dai documenti (mi capita).
Juan Lanus,

3
A volte la fonte di lettura non è sufficiente e poiché una buona spiegazione può derivare dalle risposte, ciò garantirà la migliore comprensione del concetto in questione. Alcune persone leggono semplicemente la fonte e capiscono, ma per quanto riguarda i principianti che non sono necessariamente compatibili con JavaScript? Pensaci.
cram2208

Risposte:


210

I metodi sono identici quando viene passato un oggetto o un array, ma res.json()convertiranno anche i non oggetti, come nulle undefined, che non sono JSON validi.

Il metodo utilizza anche le impostazioni dell'applicazione json replacere json spaces, quindi è possibile formattare JSON con più opzioni. Queste opzioni sono impostate in questo modo:

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

E passato a un JSON.stringify()simile così:

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

Questo è il codice nel res.json()metodo che il metodo send non ha:

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

Il metodo finisce come res.send()a alla fine:

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

return this.send(body);


16

Osservando le intestazioni inviate ...
res.send utilizza il tipo di contenuto: text / html
res.json utilizza il tipo di contenuto: application / json


0

res.jsonimpone l'argomento a JSON. res.sendprenderà un oggetto o un array non json e invierà un altro tipo. Per esempio:

Questo restituirà un numero JSON.

res.json(100)

Ciò restituirà un codice di stato ed emetterà un avviso per utilizzare sendStatus.

res.send(100)

Se l'argomento non è un oggetto o una matrice JSON (null, indefinito, booleano, stringa) e si desidera assicurarsi che venga inviato come JSON, utilizzare res.json.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.