Cara yang tepat untuk mengembalikan JSON menggunakan node atau Express

Jadi, satu dapat mencoba untuk mengambil berikut objek 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"
}
$

Apakah ada cara untuk menghasilkan persis sama tubuh dalam respon dari server menggunakan node atau express? Jelas, seseorang dapat mengatur header dan menunjukkan bahwa kandungan-jenis respon yang akan menjadi "application/json", tapi kemudian ada berbagai cara untuk menulis/mengirim objek. Salah satu yang saya telah melihat yang umum digunakan adalah dengan menggunakan perintah dalam bentuk:

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

Namun, ini memiliki dua poin di mana orang bisa berpendapat seolah-olah mereka "masalah":

  • Kami mengirimkan sebuah string.
  • Selain itu, tidak ada karakter baris baru pada akhirnya.

Ide lain adalah dengan menggunakan perintah:

response.send(anObject);

Hal ini tampaknya mengirim objek JSON berdasarkan output dari curl mirip dengan contoh pertama di atas. Namun, tidak ada karakter baris baru pada akhir tubuh ketika curl lagi digunakan pada terminal. Jadi, bagaimana seseorang dapat benar-benar menulis sesuatu seperti ini dengan karakter baris baru ditambahkan di akhir menggunakan node atau node/express?

Larutan

Tanggapan itu adalah sebuah string juga, jika anda ingin mengirim respon dipercantik, untuk beberapa canggung alasan, anda bisa menggunakan sesuatu seperti JSON.stringify(dariobjek, null, 3)

It's penting bahwa anda menetapkan Content-Type header application/json, juga.

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}

Dipercantik:

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'm tidak yakin mengapa anda ingin menghentikan itu dengan newline, tapi anda hanya bisa melakukan JSON.stringify(...) + '\n' untuk mencapai itu.

Express

Di express anda dapat melakukan ini dengan mengubah pilihan bukan.

'json replacer' JSON replacer callback, null default

'json ruang' respon JSON ruang untuk format, default-2 dalam pembangunan, 0 di produksi

Not benar-benar dianjurkan untuk mengatur untuk 40

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

Maka anda hanya bisa merespon dengan beberapa json.

res.json({ a: 1 });

It'll gunakan 'json ruang' konfigurasi untuk mendandani itu.

Komentar (14)

Sejak Express.js 3x respon objek json() metode yang menetapkan semua header dengan benar untuk anda dan mengembalikan respon dalam format JSON.

Contoh:

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

Jika anda mencoba untuk mengirim sebuah file json anda dapat menggunakan stream

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

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

jika u're menggunakan Express u dapat menggunakan ini:

res.setHeader('Content-Type', 'application/json');
res.send(JSON.stringify({key:"value"}));

atau ini hanya

res.json({key:"value"});
Komentar (0)

Anda bisa mendandani menggunakan pipa dan salah satu dari banyak prosesor. Aplikasi anda harus selalu respon dengan beban kecil mungkin.

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

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

Komentar (0)

Anda dapat menggunakan middleware untuk mengatur default Content-Type, dan mengatur Konten-Tipe berbeda untuk Api. Berikut ini sebuah contoh:

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!
        `);
})
Komentar (0)

The res.json() fungsi harus cukup untuk sebagian besar kasus.

aplikasi.dapatkan('/', (req, res) => res.json({ menjawab: 42 }));

The res.json() fungsi untuk mengkonversi parameter anda lulus ke JSON menggunakan JSON.stringify() dan set Content-Type header untuk application/json; charset=utf-8 jadi HTTP klien tahu untuk secara otomatis mem-respon.

Komentar (0)

Versi Express menggunakan app.menggunakan(express.json()) atau bodyParser.json() baca lebih lanjut tentang bodyParser middleware

Pada versi terbaru dari express kami hanya bisa menggunakan res.json()

const express = require('express'),
    port = process.env.port || 3000,
    app = express()

app.get('/', (req, res) => res.json({key: "value"}))

app.listen(port, () => console.log(`Server start at ${port}`))
Komentar (1)

Untuk header setengah dari pertanyaan, saya'm akan memberikan berteriak ke res.jenis berikut ini:

res.type('json')

setara dengan

res.setHeader('Content-Type', 'application/json')

Sumber: express docs:

Menetapkan Content-Type header HTTP untuk jenis MIME yang telah ditentukan oleh mime.lookup() untuk tipe yang ditentukan. Jika jenis berisi "/" karakter, maka set Isi-Jenis jenis.

Komentar (0)