Banyak jawaban di sini bukan praktik yang baik lagi atau tidak menjelaskan apa pun, jadi itu sebabnya saya menulis ini.
Dasar-dasar
Ketika panggilan balik dari http.createServer dipanggil, adalah ketika server benar-benar menerima semua tajuk untuk permintaan tersebut, tetapi ada kemungkinan bahwa data belum diterima, jadi kami harus menunggu untuk itu. The request http objek (contoh http.IncomingMessage) sebenarnya dapat dibaca aliran . Dalam aliran yang dapat dibaca setiap kali sepotong data tiba, suatu peristiwa dipancarkan (dengan asumsi Anda telah mendaftarkan panggilan balik ke sana) dan ketika semua potongan telah tiba suatu peristiwa dipancarkan. Berikut ini contoh cara Anda mendengarkan acara:data
end
http.createServer((request, response) => {
console.log('Now we have a http message with headers but no data yet.');
request.on('data', chunk => {
console.log('A chunk of data has arrived: ', chunk);
});
request.on('end', () => {
console.log('No more data');
})
}).listen(8080)
Konversi Buffer ke String
Jika Anda mencoba ini, Anda akan melihat potongan buffer . Jika Anda tidak berurusan dengan data biner dan perlu bekerja dengan string, saya sarankan menggunakan metode request.setEncoding yang menyebabkan stream memancarkan string yang ditafsirkan dengan pengkodean yang diberikan dan menangani karakter multi-byte dengan benar.
Buffering Chunks
Sekarang Anda mungkin tidak tertarik pada masing-masing bidak sendiri, jadi dalam hal ini mungkin Anda ingin melakukan penyangga seperti ini:
http.createServer((request, response) => {
const chunks = [];
request.on('data', chunk => chunks.push(chunk));
request.on('end', () => {
const data = Buffer.concat(chunks);
console.log('Data: ', data);
})
}).listen(8080)
Di sini Buffer.concat digunakan, yang hanya menggabungkan semua buffer dan mengembalikan satu buffer besar. Anda juga dapat menggunakan modul concat-stream yang melakukan hal yang sama:
const http = require('http');
const concat = require('concat-stream');
http.createServer((request, response) => {
concat(request, data => {
console.log('Data: ', data);
});
}).listen(8080)
Mengurai Konten
Jika Anda mencoba menerima formulir HTML, pengiriman POST tanpa file atau menyerahkan panggilan jQuery ajax dengan tipe konten default, maka tipe kontennya adalah application/x-www-form-urlencoded
dengan uft-8
encoding. Anda dapat menggunakan modul querystring untuk menghapus serialisasi dan mengakses properti:
const http = require('http');
const concat = require('concat-stream');
const qs = require('querystring');
http.createServer((request, response) => {
concat(request, buffer => {
const data = qs.parse(buffer.toString());
console.log('Data: ', data);
});
}).listen(8080)
Jika tipe konten Anda adalah JSON, Anda cukup menggunakan JSON.parse dan bukan qs.parse .
Jika Anda berurusan dengan file atau menangani tipe konten multi-bagian, maka dalam hal ini, Anda harus menggunakan sesuatu seperti tangguh yang menghilangkan semua rasa sakit karena berurusan dengan itu. Lihat jawaban saya yang lain ini di mana saya telah memposting tautan dan modul bermanfaat untuk konten multi bagian.
Perpipaan
Jika Anda tidak ingin mem-parsing konten tetapi meneruskannya ke tempat lain, misalnya mengirimnya ke permintaan http lain sebagai data atau menyimpannya ke file, saya sarankan untuk memipipkannya daripada buffering, karena akan kurang kode, menangani tekanan balik lebih baik, itu akan mengambil lebih sedikit memori dan dalam beberapa kasus lebih cepat.
Jadi jika Anda ingin menyimpan konten ke file:
http.createServer((request, response) => {
request.pipe(fs.createWriteStream('./request'));
}).listen(8080)
Membatasi Jumlah Data
Seperti jawaban lain telah dicatat, ingatlah bahwa klien jahat dapat mengirimkan Anda sejumlah besar data untuk membuat crash aplikasi Anda atau mengisi memori Anda sehingga untuk melindungi itu pastikan Anda menjatuhkan permintaan yang memancarkan data yang melewati batas tertentu. Jika Anda tidak menggunakan perpustakaan untuk menangani data yang masuk. Saya menyarankan menggunakan sesuatu seperti stream-meter yang dapat membatalkan permintaan jika mencapai batas yang ditentukan:
limitedStream = request.pipe(meter(1e7));
limitedStream.on('data', ...);
limitedStream.on('end', ...);
atau
request.pipe(meter(1e7)).pipe(createWriteStream(...));
atau
concat(request.pipe(meter(1e7)), ...);
Modul NPM
Meskipun saya jelaskan di atas tentang bagaimana Anda dapat menggunakan badan permintaan HTTP, hanya untuk buffering dan parsing konten, saya sarankan menggunakan salah satu modul ini daripada menerapkannya sendiri karena mereka mungkin akan menangani kasus tepi yang lebih baik. Untuk ekspres saya sarankan menggunakan body-parser . Untuk koa, ada modul serupa .
Jika Anda tidak menggunakan kerangka kerja, tubuh cukup bagus.