Diferença entre res.send e res.json no Express.js

200

Qual é a diferença real entre res.sende res.jsoncomo ambos parecem executar a mesma operação de resposta ao cliente.

brg
fonte
73
Reserve um momento para observar como o pessoal que postou as respostas foi ao github e leu o código-fonte. Este é um bom hábito para aprender e estabelecer. A verdade está na fonte.
Peter Lyons
31
@ PeterLyons Concordo que este é um bom hábito, mas você quis dizer que o carneiro deveria ter procurado a fonte em vez de fazer a pergunta? Isso não anula o objetivo deste site? A presença desta pergunta, com respostas referentes a uma boa fonte (The Source!) É útil.
LinusR
3
Sim, ensine um homem a pescar e tudo.
Peter Lyons
71
Quando nos dizem "RTFS" (Leia a fonte), na verdade, isso significa que os documentos falham em comunicar o que deveriam. Sim, ter a fonte nos permite verificá-la, mas não é preciso chegar a ela, exceto em casos obscuros. Todos esses recursos do Express são realmente ótimos, mas os documentos não são suficientes. O SO está cheio de perguntas sobre coisas do Express que as pessoas não conseguem entender nos documentos (acontece comigo).
Juan Lanus 30/03
3
Às vezes, a fonte de leitura não é suficiente e, como uma boa explicação pode surgir das respostas, isso garantirá a melhor compreensão do conceito envolvido. Algumas pessoas simplesmente liam a fonte e entendiam, mas e os iniciantes que não são necessariamente compatíveis com javascript? Pense nisso.
cram2208

Respostas:

210

Os métodos são idênticos quando um objeto ou matriz é passado, mas res.json()também convertem não-objetos, como nulle undefined, que não são JSON válidos.

O método também usa as configurações de aplicativo json replacere json spaces, para que você possa formatar o JSON com mais opções. Essas opções são definidas assim:

app.set('json spaces', 2);
app.set('json replacer', replacer);

E passou para um JSON.stringify()assim:

JSON.stringify(value, replacer, spacing);
// value: object to format
// replacer: rules for transforming properties encountered during stringifying
// spacing: the number of spaces for indentation

Este é o código no res.json()método que o método send não possui:

var app = this.app;
var replacer = app.get('json replacer');
var spaces = app.get('json spaces');
var body = JSON.stringify(obj, replacer, spaces);

O método acaba como um res.send()no final:

this.charset = this.charset || 'utf-8';
this.get('Content-Type') || this.set('Content-Type', 'application/json');

return this.send(body);
hexacianida
fonte
16

Procurando nos cabeçalhos enviados ...
res.send usa o tipo de conteúdo: text / html
res.json usa o tipo de conteúdo: application / json

Roger Heathcote
fonte
0

res.jsonforça o argumento para JSON. res.sendpegará um objeto ou matriz não json e enviará outro tipo. Por exemplo:

Isso retornará um número JSON.

res.json(100)

Isso retornará um código de status e emitirá um aviso para usar o sendStatus.

res.send(100)

Se o seu argumento não for um objeto ou matriz JSON (nulo, indefinido, booleano, sequência de caracteres) e você deseja garantir que ele seja enviado como JSON, use res.json.

Steven Spungin
fonte