Forma adequada de retornar JSON usando o nó ou Express

Assim, pode-se tentar ir buscar o seguinte objecto 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? Claramente, pode-se definir os cabeçalhos e indicar que o tipo de conteúdo da resposta será "application/json", mas depois há diferentes maneiras de escrever/enviar o objeto. A que eu tenho visto ser comumente usada é usando um comando do formulário:

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

Contudo, isto tem dois pontos onde se poderia argumentar como se fossem "problemas":

  • Estamos a enviar um cordel.
  • Além disso, não há um novo caractere de linha no final.

Outra ideia é usar o comando:

response.send(anObject);

Isto parece estar enviando um objeto JSON baseado na saída de cacho semelhante ao primeiro exemplo acima. No entanto, não há um novo caractere de linha no final do corpo quando o encaracolamento está sendo usado novamente em um terminal. Então, como se pode realmente escrever algo como isto com um novo caractere de linha anexado no final usando nó ou nó/expressão?

Solução

Essa resposta também é uma string, se você quiser enviar a resposta pré-estificada, por alguma razão estranha, você poderia usar algo como JSON.stringify(anObject, null, 3)

É importante que você configure o cabeçalho Content-Type' paraapplication/json', também.

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}

Prettified:

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

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

Expresso

Em expresso, você pode fazer isso mudando as opções em seu lugar.

'json substituto' JSON substituto callback, nulo por defeito

'espaços json'Espaços de resposta JSON para formatação, padrão para 2 em desenvolvimento, 0 em produção

Não é realmente recomendado definir para 40_

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

Depois podias responder com um pastor.

res.json({ a: 1 });

It'utilizará os 'espaços json' configuração para embelezá-lo.

Comentários (14)

Desde Express.js 3x o objeto de resposta tem um método json() que define todos os cabeçalhos corretamente para você e retorna a resposta no formato JSON.

Exemplo:

res.json({"foo": "bar"});
Comentários (2)

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);
});
Comentários (1)