Maneira correta de retornar o JSON usando o nó ou o Express

Então, pode-se tentar buscar o seguinte object 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" } $ 

Existe uma maneira de produzir exatamente o mesmo corpo em uma resposta de um servidor usando nó ou expresso? É claro que é possível definir os headers e indicar que o tipo de conteúdo da resposta será “application / json”, mas existem maneiras diferentes de gravar / enviar o object. O que eu vi normalmente sendo usado é usando um comando do formulário:

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

No entanto, isso tem dois pontos em que alguém poderia argumentar como se fossem “problemas”:

  • Estamos enviando uma string.
  • Além disso, não há um novo caractere de linha no final.

Outra ideia é usar o comando:

 response.send(anObject); 

Isso parece estar enviando um object JSON com base na saída do curl semelhante ao primeiro exemplo acima. No entanto, não há nenhum caractere de nova linha no final do corpo quando o curl está novamente sendo usado em um terminal. Então, como alguém pode realmente escrever algo assim com um novo caractere de linha acrescentado no final usando node ou node / express?

   

Essa resposta é uma string também, se você quiser enviar a resposta prettificada, por algum motivo estranho, você poderia usar algo como JSON.stringify(anObject, null, 3)

É importante que você defina o header Content-Type como application/json também.

 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} 

Prettified:

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

Eu não sei exatamente por que você quer terminá-lo com uma nova linha, mas você poderia apenas fazer JSON.stringify(...) + '\n' para conseguir isso.

Expressar

Em expresso, você pode fazer isso alterando as opções .

'json replacer' Chamada de substituição do JSON, nula por padrão

'json spaces' resposta JSON 'json spaces' para formatação, padrão 2 em desenvolvimento, 0 em produção

Na verdade, não recomendado para definir a 40

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

Então você poderia apenas responder com algum json.

 res.json({ a: 1 }); 

Vai usar a configuração 'json spaces ‘ para embelezar.

Como o Express.js 3x o object de resposta possui um método json () que configura todos os headers corretamente para você e retorna a resposta no formato JSON.

Exemplo:

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

Se você está tentando enviar um arquivo json, você pode usar streams

 var usersFilePath = path.join(__dirname, 'users.min.json'); apiRouter.get('/users', function(req, res){ var readable = fs.createReadStream(usersFilePath); readable.pipe(res); }); 

Você pode apenas simplificar usando pipe e um dos muitos processadores. Seu aplicativo deve sempre responder com o menor volume possível.

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

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

Você pode usar um middleware para definir o Content-Type padrão e definir Content-Type de forma diferente para APIs específicas. Aqui está um exemplo:

 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(` Tove Jani Reminder Don't forget me this weekend! `); })