web-dev-qa-db-fra.com

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

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

187
ram

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

La méthode utilise également les paramètres de l'application json replacer et json spaces pour vous permettre de formater JSON avec davantage d'options. Ces options sont définies comme suit:

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

Et passé à une JSON.stringify() comme ceci:

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 la méthode 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 res.send() à la fin:

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

return this.send(body);
197
hexacyanide

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

res.json appelle finalement res.send, mais avant cela:

  • respecte les paramètres de l'application json spaces et json replacer
  • assure que la réponse aura le jeu de caractères utf8 et le type de contenu application/json
61
Peter Lyons

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

13
technicalbloke