Perbedaan antara res.send dan res.json di Express.js

200

Apa perbedaan aktual antara res.senddan res.jsonkarena keduanya tampaknya melakukan operasi yang sama dalam merespons klien.

brg
sumber
73
Luangkan waktu sejenak untuk memperhatikan bagaimana orang-orang yang memposting jawaban baru saja pergi ke github dan membaca kode sumber. Ini adalah kebiasaan yang baik untuk dipelajari dan dikembangkan. Kebenaran terletak pada Sumber.
Peter Lyons
31
@PeterLyons Saya setuju ini adalah kebiasaan yang baik, tetapi apakah Anda maksud bahwa ram harus melihat sumber daripada menanyakan pertanyaan? Bukankah ini mengalahkan tujuan situs ini? Kehadiran pertanyaan ini, dengan jawaban yang merujuk pada sumber yang baik (Sumber!) Bermanfaat.
LinusR
3
Ya, ajari pria memancing dan semuanya.
Peter Lyons
71
Ketika kita diberi tahu "RTFS" (Read The Source) itu sebenarnya berarti bahwa dokumen gagal berkomunikasi apa yang seharusnya. Ya, memiliki sumber memungkinkan kita untuk memeriksanya, tetapi orang tidak perlu sampai ke sana kecuali dalam kasus yang tidak jelas. Semua fitur Express ini Benar-Benar Hebat, tetapi dokumennya gagal, banyak. SO penuh dengan pertanyaan tentang hal-hal Ekspres yang orang tidak dapat mengerti dari dokumen (terjadi pada saya).
Juan Lanus
3
Terkadang sumber bacaan tidak memadai dan karena penjelasan yang baik mungkin muncul dari jawaban, ini akan memastikan pemahaman terbaik dari konsep yang terlibat. Beberapa orang hanya membaca sumber dan mengerti, tetapi bagaimana dengan pemula yang belum tentu ramah javascript? Pikirkan tentang itu.
cram2208

Jawaban:

210

Metode identik ketika suatu objek atau array dilewatkan, tetapi res.json()juga akan mengkonversi non-objek, seperti nulldan undefined, yang tidak valid JSON.

Metode ini juga menggunakan pengaturan json replacerdan json spacesaplikasi, sehingga Anda dapat memformat JSON dengan lebih banyak opsi. Opsi-opsi itu diatur seperti ini:

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

Dan diteruskan ke JSON.stringify()seperti:

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

Ini adalah kode dalam res.json()metode yang tidak dimiliki metode kirim:

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

Metode ini berakhir sebagai res.send()pada akhirnya:

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

return this.send(body);
hexacyanide
sumber
16

Mencari di header yang dikirim ...
res.send menggunakan tipe-konten: teks / html
res.json menggunakan tipe-konten: application / json

Roger Heathcote
sumber
0

res.jsonmemaksa argumen ke JSON. res.sendakan mengambil objek atau array non-json dan mengirim tipe lain. Sebagai contoh:

Ini akan mengembalikan nomor JSON.

res.json(100)

Ini akan mengembalikan kode status dan mengeluarkan peringatan untuk menggunakan sendStatus.

res.send(100)

Jika argumen Anda bukan objek atau array JSON (null, undefined, boolean, string), dan Anda ingin memastikannya dikirim sebagai JSON, gunakan res.json.

Steven Spungin
sumber