Bonne façon de retourner JSON en utilisant node ou Express

ainsi, on peut tenter 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 à partir d'un serveur utilisant un noeud ou express? Clairement, on peut définir les en-têtes et indiquent que le type de contenu de la réponse va être "application/json", mais alors il y a différentes façons d'écrire/envoyer l'objet. Celui que j'ai vu couramment utilisé est en utilisant une commande de la forme:

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

cependant, il y a deux points où l'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 nouveau caractère de 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 similaire au premier exemple ci-dessus. Cependant, il n'y a pas de nouvelle ligne caractère à l'extrémité du corps lorsque curl est de nouveau utilisé sur un terminal. Ainsi, comment peut-on réellement écrire quelque chose comme ceci avec un nouveau caractère de ligne ajouté à la fin en utilisant le noeud ou le noeud/express?

287
demandé sur MightyMouse 2013-10-31 04:16:51

5 réponses

cette réponse est aussi une chaîne, si vous voulez envoyer la réponse prétifiée, pour une raison étrange, vous pouvez utiliser quelque chose comme JSON.stringify(anObject, null, 3)

il est important que vous positionniez aussi l'en-tête Content-Type sur application/json .

var http = require('http');

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

// > {"a":1}

Embellie:

var http = require('http');

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

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

Je ne sais pas exactement pourquoi vous voulez y mettre fin avec une nouvelle ligne, mais vous pourriez juste faire JSON.stringify(...) + '\n' pour y arriver.

Express

dans express vous pouvez le faire en en changeant les options à la place .

'json replacer' JSON de la poudre de rappel, la valeur null par défaut

'json spaces' réponse JSON espaces pour le formatage, la valeur par défaut est 2 dans le développement, 0 dans la production de

Non réellement recommandé pour régler à 40

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

alors vous pourriez répondre avec un peu de json.

res.json({ a: 1 });

il utilisera la configuration 'json spaces pour le prétifier.

433
répondu bevacqua 2015-05-18 17:46:41

Depuis Express.js 3x l'objet response a une méthode json () qui positionne tous les en-têtes correctement pour vous et renvoie la réponse au format JSON.

exemple:

res.json({"foo": "bar"});
304
répondu JamieL 2015-05-07 12:17:52

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);
});
16
répondu Connor Leech 2015-08-26 20:19:59

vous pouvez juste le prétifier en utilisant la pipe et un des nombreux processeurs. Votre application doit toujours répondre avec une charge aussi faible que possible.

$ curl -i -X GET http://echo.jsontest.com/key/value/anotherKey/anotherValue | underscore print

https://github.com/ddopson/underscore-cli

4
répondu pawelzny 2016-07-06 07:10:03

vous pouvez utiliser un middleware pour définir le type de contenu par défaut, et définir le type de contenu différemment pour des API particulières. Voici un exemple:

const express = require('express');
const app = express();

const port = process.env.PORT || 3000;

const server = app.listen(port);

server.timeout = 1000 * 60 * 10; // 10 minutes

// Use middleware to set the default Content-Type
app.use(function (req, res, next) {
    res.header('Content-Type', 'application/json');
    next();
});

app.get('/api/endpoint1', (req, res) => {
    res.send(JSON.stringify({value: 1}));
})

app.get('/api/endpoint2', (req, res) => {
    // Set Content-Type differently for this particular API
    res.set({'Content-Type': 'application/xml'});
    res.send(`<note>
        <to>Tove</to>
        <from>Jani</from>
        <heading>Reminder</heading>
        <body>Don't forget me this weekend!</body>
        </note>`);
})
0
répondu Yuci 2018-05-22 16:20:51