Diferencia entre res.send y res.json en Express.js

201

¿Cuál es la diferencia real entre res.sendy res.jsonya que ambos parecen realizar la misma operación de responder al cliente?

brg
fuente
73
Tómese un momento para observar cómo la gente que publica las respuestas fue a github y leyó el código fuente. Este es un buen hábito para aprender y establecer. La verdad yace en la fuente.
Peter Lyons
31
@PeterLyons Estoy de acuerdo en que este es un buen hábito, pero ¿quisiste decir que Ram debería haber mirado la fuente en lugar de hacer la pregunta? ¿Esto no vence el propósito de este sitio? La presencia de esta pregunta, con respuestas que se refieren a una buena fuente (¡The Source!) Es útil.
LinusR
3
Sí, enseña a un hombre a pescar y todo.
Peter Lyons
72
Cuando se nos dice "RTFS" (Leer la fuente), en realidad significa que los documentos no pueden comunicar lo que deberían. Sí, tener la fuente nos permite verificarlo, pero uno no debería necesitar acceder a él, excepto en casos oscuros. Todas estas características Express son realmente geniales, pero los documentos se quedan cortos, por mucho. SO está lleno de preguntas sobre Express cosas que la gente no puede entender de los documentos (me pasa a mí).
Juan Lanus
3
A veces, la fuente de lectura no es suficiente y, como una buena explicación puede surgir de las respuestas, esto asegurará la mejor comprensión del concepto involucrado. Algunas personas simplemente leerían la fuente y entenderían, pero ¿qué pasa con los principiantes que no son necesariamente compatibles con JavaScript? Piénsalo.
cram2208

Respuestas:

211

Los métodos son idénticos cuando se pasa un objeto o matriz, pero res.json()también convertirán objetos que no son, como nully undefined, que no son JSON válidos.

El método también utiliza la configuración de la aplicación json replacery json spaces, por lo que puede formatear JSON con más opciones. Esas opciones se configuran así:

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

Y pasó a algo JSON.stringify()así:

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

Este es el código en el res.json()método que el método de envío no tiene:

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

El método termina como res.send()a al final:

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

return this.send(body);
hexacianuro
fuente
16

Buscando en los encabezados enviados ...
res.send usa content-type: text / html
res.json usa content-type: application / json

Roger Heathcote
fuente
0

res.jsonfuerza el argumento a JSON. res.sendtomará un objeto o matriz que no sea json y enviará otro tipo. Por ejemplo:

Esto devolverá un número JSON.

res.json(100)

Esto devolverá un código de estado y emitirá una advertencia para usar sendStatus.

res.send(100)

Si su argumento no es un objeto o matriz JSON (nulo, indefinido, booleano, cadena) y desea asegurarse de que se envíe como JSON, use res.json.

Steven Spungin
fuente