Modo corretto di restituire JSON usando nodo o Express

Quindi, si può tentare di recuperare il seguente oggetto JSON:

$ 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"
}
$

C'è un modo per produrre esattamente lo stesso corpo in una risposta da un server usando node o express? Chiaramente, si possono impostare le intestazioni e indicare che il content-type della risposta sarà "application/json", ma poi ci sono diversi modi di scrivere/inviare l'oggetto. Quello che ho visto essere comunemente usato è l'uso di un comando della forma:

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

Tuttavia, questo ha due punti in cui si potrebbe discutere come se fossero "problemi":

  • Stiamo inviando una stringa.
  • Inoltre, non c'è un nuovo carattere di linea alla fine.

Un'altra idea è quella di usare il comando:

response.send(anObject);

Questo sembra inviare un oggetto JSON basato sull'output di curl simile al primo esempio sopra. Tuttavia, non c'è alcun carattere di nuova linea alla fine del corpo quando curl viene nuovamente utilizzato su un terminale. Quindi, come si può effettivamente scrivere qualcosa del genere con un nuovo carattere di riga aggiunto alla fine usando node o node/express?

Soluzione

Anche quella risposta è una stringa, se vuoi inviare la risposta prettificata, per qualche ragione imbarazzante, potresti usare qualcosa come JSON.stringify(anObject, null, 3)

È importante anche impostare l'intestazione Content-Type su 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}

Impreziosito:

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
// >  }

Non sono esattamente sicuro del perché tu voglia terminarlo con una newline, ma potresti semplicemente fare JSON.stringify(...) + '\n' per ottenere ciò.

Express

In express puoi farlo cambiando invece le opzioni.

'json replacer' JSON replacer callback, null di default

'json spaces' Spazi di risposta JSON per la formattazione, di default 2 in sviluppo, 0 in produzione

Non è raccomandato impostare a 40

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

Allora potresti semplicemente rispondere con del json.

res.json({ a: 1 });

Userà la configurazione 'json spaces' per abbellirlo.

Commentari (14)

Da Express.js 3x l'oggetto response ha un metodo json() che imposta correttamente tutte le intestazioni per voi e restituisce la risposta in formato JSON.

Esempio:

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

Se state cercando di inviare un file json potete usare i flussi

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

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