255 votes

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

Quelle est la différence réelle entre res.send y res.json car les deux semblent effectuer la même opération de réponse au client.

90 votes

Prenez le temps de noter que les personnes qui postent des réponses sont allées sur Github et ont lu le code source. C'est une bonne habitude à prendre. La vérité se trouve dans la source.

39 votes

@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 renvoyant à une bonne source (La Source !) est utile.

5 votes

Oui, apprendre à un homme à pêcher et tout ça.

257voto

hexacyanide Points 15723

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

La méthode utilise également le json replacer y json spaces les paramètres de l'application, afin que vous puissiez 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() comme ça :

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 dans le res.json() 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 se termine par 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);

89voto

Peter Lyons Points 47794

https://github.com/visionmedia/express/blob/ee228f7aea6448cf85cc052697f8d831dce785d5/lib/response.js#L174

res.json appelle éventuellement res.send mais avant ça :

  • respecte le json spaces y json replacer paramètres de l'application
  • garantit que la réponse aura un jeu de caractères utf8 et un type de contenu application/json.

24voto

technicalbloke Points 565

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

edit : send change en fait ce qui est envoyé en fonction de ce qui lui est donné, ainsi les chaînes sont envoyées en text/html, mais si vous lui passez un objet, il émet application/json.

2voto

Steven Spungin Points 5660

res.json force l'argument en JSON. res.send prendra un objet non-json 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,undefined,boolean,string), et que vous voulez vous assurer qu'il est envoyé en JSON, utilisez res.json .

0 votes

Dans cette phrase : will take an non-json object or array -> on le lit comme : non-json object o array Veuillez donc être plus clair si possible.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X