Façon correcte de retourner JSON en utilisant node ou Express

Ainsi, on peut essayer de récupérer l'objet JSON suivant :

$ curl -i -X GET http://echo.jsontest.com/key/value/anotherKey/anotherValue
HTTP/1.1 200 OK
Access-Control-Allow-Origin: *
Content-Type: application/json; charset=ISO-8859-1
Date: Wed, 30 Oct 2013 22:19:10 GMT
Server: Google Frontend
Cache-Control: private
Alternate-Protocol: 80:quic,80:quic
Transfer-Encoding: chunked

{
   "anotherKey": "anotherValue",
   "key": "value"
}
$

Existe-t-il un moyen de produire exactement le même corps dans une réponse d'un serveur utilisant node ou express ? Il est clair que l'on peut définir les en-têtes et indiquer que le type de contenu de la réponse sera "application/json&quot ;, mais il y a ensuite différentes façons d'écrire/envoyer l'objet. Celle que j'ai vue couramment utilisée est une commande de la forme :

response.write(JSON.stringify(anObject));

Cependant, il y a deux points sur lesquels on pourrait argumenter comme s'il s'agissait de "problèmes" :

  • Nous envoyons une chaîne de caractères.
  • De plus, il n'y a pas de caractère de nouvelle ligne à la fin.

Une autre idée est d'utiliser la commande :

response.send(anObject);

Cela semble envoyer un objet JSON basé sur la sortie de curl, comme dans le premier exemple ci-dessus. Cependant, il n'y a pas de caractère de nouvelle ligne à la fin du corps lorsque curl est à nouveau utilisé sur un terminal. Donc, comment peut-on réellement écrire quelque chose comme ceci avec un caractère de nouvelle ligne ajouté à la fin en utilisant node ou node/express ?

Solution

Cette réponse est aussi une chaîne de caractères, si vous voulez envoyer la réponse préttifiée, pour une raison maladroite, vous pouvez utiliser quelque chose comme JSON.stringify(anObject, null, 3).

Il est important que vous définissiez l'en-tête Content-Type à application/json, aussi.

var http = require('http');

var app = http.createServer(function(req,res){
    res.setHeader('Content-Type', 'application/json');
    res.end(JSON.stringify({ a: 1 }));
});
app.listen(3000);

// > {"a":1}

Joli :

var http = require('http');

var app = http.createServer(function(req,res){
    res.setHeader('Content-Type', 'application/json');
    res.end(JSON.stringify({ a: 1 }, null, 3));
});
app.listen(3000);

// >  {
// >     "a": 1
// >  }

Je ne sais pas exactement pourquoi vous voulez le terminer par une nouvelle ligne, mais vous pourriez simplement faire `JSON.stringify(...) + '\n'`` pour y parvenir.

Express

Dans Express, vous pouvez faire cela en [modifiant les options à la place][1].

'json replacer' La fonction de rappel de l'outil de remplacement JSON est nulle par défaut.

'json spaces'Espaces de réponse JSON pour le formatage, 2 par défaut en développement, 0 en production.

Il n'est pas recommandé de fixer la valeur à 40.

app.set('json spaces', 40);

Vous pourriez alors répondre avec du json.

res.json({ a: 1 });

Il utilisera la configuration 'json spaces&#39 ; pour l'embellir.

[1] : http://expressjs.com/3x/api.html

Commentaires (14)

Depuis Express.js 3x, l'objet réponse possède une méthode json() qui définit correctement tous les en-têtes pour vous et renvoie la réponse au format JSON.

Exemple :

res.json({"foo": "bar"});
Commentaires (2)

Si vous essayez d'envoyer un fichier json, vous pouvez utiliser les flux.

var usersFilePath = path.join(__dirname, 'users.min.json');

apiRouter.get('/users', function(req, res){
    var readable = fs.createReadStream(usersFilePath);
    readable.pipe(res);
});
Commentaires (1)