web-dev-qa-db-fra.com

Méthode appropriée pour renvoyer JSON à l'aide de node ou Express

Donc, 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? Clairement, on peut définir les en-têtes et indiquer que le type de contenu de la réponse va être "application/json", mais il existe alors différentes manières d'écrire/d'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 sur lesquels on pourrait argumenter comme s'il s'agissait de "problèmes":

  • Nous envoyons une chaîne.
  • 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);

Ceci semble envoyer un objet JSON basé sur la sortie de curl similaire au 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. Alors, comment peut-on écrire quelque chose comme ceci avec un caractère de nouvelle ligne ajouté à la fin en utilisant node ou node/express?

329
MightyMouse

Cette réponse est également une chaîne. Si vous voulez envoyer la réponse en joliment affinée, pour une raison quelconque, vous pouvez utiliser quelque chose comme JSON.stringify(anObject, null, 3).

Il est également important de définir 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.end(JSON.stringify({ a: 1 }));
});
app.listen(3000);

// > {"a":1}

Prettifié:

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 souhaitez y mettre fin avec une nouvelle ligne, mais vous pouvez simplement faire JSON.stringify(...) + '\n' pour y parvenir.

Express

En express, vous pouvez le faire en en modifiant les options à la place } _.

'json replacer' rappel du remplaçant JSON, null par défaut

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

Pas vraiment recommandé de régler à 40

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

Ensuite, vous pouvez simplement répondre avec un json.

res.json({ a: 1 });

Il utilisera la configuration 'json spaces 'pour le rendre plus beau.

484
bevacqua

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

Exemple:

res.json({"foo": "bar"});
329
JamieL

Si vous essayez d'envoyer un fichier JSON, vous pouvez utiliser des flux

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

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

Vous pouvez simplement le rendre beau en utilisant un tuyau et un processeur. 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
pawelzny

Vous pouvez utiliser un middleware pour définir le type de contenu par défaut et définir différemment le type de contenu 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>`);
})
2
Yuci

si vous utilisez Express, vous pouvez utiliser ceci:

res.setHeader('Content-Type', 'application/json');
res.send(JSON.stringify({key:"value"}));

ou juste ça

res.json({key:"value"});
0
IXOVER

Ancienne version d'Express use app.use(express.json()) ou bodyParser.json()pour en savoir plus sur le middleware bodyParser

Sur la dernière version d’express, nous pourrions simplement utiliser res.json()

const express = require('express'),
    port = process.env.port || 3000,
    app = express()

app.get('/', (req, res) => res.json({key: "value"}))

app.listen(port, () => console.log(`Server start at ${port}`))
0
Aung Zan Baw