Différence entre res.send et res.json dans Express.js

201

Quelle est la différence réelle entre res.sendet res.jsoncomme les deux semble effectuer la même opération de réponse au client.

brg
la source
73
Prenez un moment pour noter comment les gens qui publient des réponses sont simplement allés sur github et ont lu le code source. C'est une bonne habitude d'apprendre et de s'établir. La vérité réside dans La Source.
Peter Lyons
31
@PeterLyons Je suis d'accord pour dire que c'est une bonne habitude, mais vouliez-vous dire que Ram aurait dû regarder la source au lieu de poser la question? Cela ne va-t-il pas à l'encontre de l'objectif de ce site? La présence de cette question, avec des réponses faisant référence à une bonne source (La Source!) Est utile.
LinusR
3
Oui, apprenez à un homme à pêcher et tout.
Peter Lyons
72
Quand on nous dit "RTFS" (lire la source), cela signifie en fait que les documents ne parviennent pas à communiquer ce qu'ils devraient. Oui, avoir la source nous permet de le vérifier, mais il ne faut pas y accéder sauf dans des cas obscurs. Toutes ces fonctionnalités Express sont vraiment géniales, mais les documents sont loin d'être suffisants. SO est plein de questions sur les choses Express que les gens ne peuvent pas comprendre de la documentation (ça m'arrive).
Juan Lanus
3
Parfois, la lecture de la source n'est pas suffisante et comme une bonne explication peut découler des réponses, cela garantira la meilleure compréhension du concept impliqué. Certaines personnes liraient simplement la source et comprendraient, mais qu'en est-il des débutants qui ne sont pas nécessairement compatibles avec javascript? Pensez-y.
cram2208

Réponses:

211

Les méthodes sont identiques lorsqu'un objet ou un tableau est transmis, mais res.json()convertissent également les non-objets, tels que nullet undefined, qui ne sont pas des JSON valides.

La méthode utilise également les paramètres d'application json replaceret json spaces, de sorte que vous pouvez formater JSON avec plus d'options. Ces options sont définies comme suit:

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

Et passé à un JSON.stringify()pareil:

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

C'est le code de la res.json()méthode que la méthode d'envoi n'a pas:

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

La méthode finit comme un res.send()à la fin:

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

return this.send(body);
hexacyanide
la source
16

En regardant dans les en-têtes envoyés ...
res.send utilise le type de contenu: text / html
res.json utilise le type de contenu: application / json

Roger Heathcote
la source
0

res.jsonforce l'argument à JSON. res.sendprendra un objet ou un tableau non json et enverra un autre type. Par exemple:

Cela renverra un numéro JSON.

res.json(100)

Cela renverra un code d'état et émettra un avertissement pour utiliser sendStatus.

res.send(100)

Si votre argument n'est pas un objet ou un tableau JSON (null, non défini, booléen, chaîne) et que vous voulez vous assurer qu'il est envoyé en JSON, utilisez res.json.

Steven Spungin
la source