Jika Anda menggunakan Express (kinerja tinggi, pengembangan web kelas tinggi untuk Node.js), Anda dapat melakukan ini:
HTML:
<form method="post" action="/">
<input type="text" name="user[name]">
<input type="text" name="user[email]">
<input type="submit" value="Submit">
</form>
Klien API:
fetch('/', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
user: {
name: "John",
email: "[email protected]"
}
})
});
Node.js: (sejak Express v4.16.0)
// Parse URL-encoded bodies (as sent by HTML forms)
app.use(express.urlencoded());
// Parse JSON bodies (as sent by API clients)
app.use(express.json());
// Access the parse results as request.body
app.post('/', function(request, response){
console.log(request.body.user.name);
console.log(request.body.user.email);
});
Node.js: (untuk Express <4.16.0)
const bodyParser = require("body-parser");
/** bodyParser.urlencoded(options)
* Parses the text as URL encoded data (which is how browsers tend to send form data from regular forms set to POST)
* and exposes the resulting object (containing the keys and values) on req.body
*/
app.use(bodyParser.urlencoded({
extended: true
}));
/**bodyParser.json(options)
* Parses the text as JSON and exposes the resulting object on req.body.
*/
app.use(bodyParser.json());
app.post("/", function (req, res) {
console.log(req.body.user.name)
});
app.use(express.bodyParser());
.Anda dapat menggunakan
querystring
modul:Sekarang, misalnya, jika Anda memiliki
input
bidang dengan namaage
, Anda bisa mengaksesnya menggunakan variabelpost
:sumber
var POST = qs.parse(body); // use POST
hanya untuk noobs seperti saya: ketika nama bidang teks input adalah "pengguna",Post.user
akan menampilkan data bidang itu. misconsole.log(Post.user);
readable
callback alih-alih membangun data menjadi string tubuh. Setelah dipecat, tubuh tersedia melaluirequest.read();
req.connection.destroy();
tidak mencegah callback dieksekusi! Misalnya panggilan balik "on end" akan dieksekusi dengan tubuh terpotong! Ini mungkin bukan yang Anda inginkan ...Pastikan untuk mematikan koneksi jika seseorang mencoba membanjiri RAM Anda!
sumber
var POST = qs.parse(body); // use POST
hanya untuk noobs: ketika nama bidang teks input adalah "pengguna", pengguna Post.user akan menampilkan data bidang itu. misalnya console.log (Post.user);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
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:
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:
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
denganuft-8
encoding. Anda dapat menggunakan modul querystring untuk menghapus serialisasi dan mengakses properti: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:
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:
atau
atau
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.
sumber
request
digunakan kembali danrequest.on('end')
mendapat dipanggil beberapa kali? Bagaimana saya bisa menghindarinya?request.on('end', ...)
akan dipanggil.Berikut ini adalah pembungkus tanpa kerangka kerja yang sangat sederhana berdasarkan pada jawaban dan artikel lain yang diposting di sini:
Contoh penggunaan:
sumber
response.post
lebih masuk akalrequest.post
. Saya memperbarui pos.Akan lebih bersih jika Anda menyandikan data Anda ke JSON , kemudian mengirimkannya ke Node.js.
sumber
qs.parse()
,JSON.parse()
mengubah tubuh menjadi sesuatu yang bisa digunakan. Contoh:,var post = JSON.parse(body);
lalu akses data denganpost.fieldname
. (Moral dari cerita ini, jika Anda bingung tentang apa yang Anda lihat, jangan lupakantypeof
!)request.setEncoding
untuk membuat ini berfungsi dengan baik karena mungkin tidak menangani karakter non ascii dengan benar.Bagi siapa pun yang bertanya-tanya bagaimana melakukan tugas sepele ini tanpa menginstal kerangka kerja web, saya berhasil melakukan ini bersama-sama. Produksi hampir tidak siap tetapi tampaknya berhasil.
sumber
Anda dapat menggunakan
body-parser
, middleware parsing Node.js body.Beban pertama
body-parser
Beberapa contoh kode
Dokumentasi lebih lanjut dapat ditemukan di sini
sumber
Referensi: https://nodejs.org/en/docs/guides/anatomy-of-an-http-transaction/
sumber
Inilah cara Anda dapat melakukannya jika Anda menggunakan node-formidable :
sumber
Jika Anda lebih suka menggunakan Node.js murni maka Anda dapat mengekstrak data POST seperti ditunjukkan di bawah ini:
sumber
1) Instal
'body-parser'
dari npm.2) Kemudian di app.ts Anda
3) maka Anda perlu menulis
dalam modul app.ts
4) perlu diingat bahwa Anda termasuk
di bagian atas atau sebelum deklarasi modul.
Ex:
5) Kemudian gunakan
sumber
Jika Anda tidak ingin memotong data bersama dengan
data
panggilan baliknya, Anda selalu dapat menggunakanreadable
panggilan balik seperti ini:Pendekatan ini mengubah permintaan yang masuk, tetapi segera setelah Anda menyelesaikan respons Anda, permintaan tersebut akan menjadi sampah yang dikumpulkan, sehingga seharusnya tidak menjadi masalah.
Pendekatan lanjutan akan memeriksa ukuran tubuh terlebih dahulu, jika Anda takut tubuh besar.
sumber
request
adalah aliran node.js yang normal, sehingga Anda dapat memeriksarequest.headers
panjang tubuh dan membatalkan permintaan jika perlu.Ada banyak cara untuk melakukannya. Namun, cara tercepat yang saya tahu adalah menggunakan perpustakaan Express.js dengan body-parser.
Itu bisa berfungsi untuk string, tapi saya akan mengubah bodyParser.urlencoded menjadi bodyParser.json sebagai gantinya jika data POST berisi array JSON.
Info lebih lanjut: http://www.kompulsa.com/how-to-accept-and-parse-post-requests-in-node-js/
sumber
Anda perlu menerima
POST
data dalam potongan menggunakanrequest.on('data', function(chunk) {...})
Anda harus mempertimbangkan menambahkan batas ukuran pada posisi yang ditunjukkan seperti yang disarankan jh .
sumber
setTimeout
koneksi yang mengakhiri setelah jangka waktu tertentu, jika permintaan penuh tidak diterima dalam jendela itu.Express v4.17.0
sumber
Jika Anda menggunakan Express.js , sebelum Anda dapat mengakses req.body, Anda harus menambahkan bodyParser middleware:
Maka Anda bisa meminta
sumber
Dan jika Anda tidak ingin menggunakan seluruh kerangka kerja seperti Express, tetapi Anda juga membutuhkan berbagai jenis bentuk, termasuk unggahan, maka formaline mungkin merupakan pilihan yang baik.
Tercantum dalam modul Node.js
sumber
Saya menemukan video yang menjelaskan cara mencapai ini: https://www.youtube.com/watch?v=nuw48-u3Yrg
Ini menggunakan modul "http" bersama dengan modul "querystring" dan "stringbuilder". Aplikasi mengambil dua angka (menggunakan dua kotak teks) dari halaman web dan setelah mengirimkan, mengembalikan jumlah dari dua (bersama dengan mempertahankan nilai-nilai dalam kotak teks). Ini adalah contoh terbaik yang bisa saya temukan di tempat lain.
Kode sumber terkait:
sumber
Bagi mereka yang menggunakan unggahan POST biner mentah tanpa pengkodean overhead Anda dapat menggunakan:
klien:
server:
sumber
Anda dapat menggunakan middleware ekspres , yang sekarang memiliki body-parser di dalamnya. Ini berarti yang perlu Anda lakukan adalah sebagai berikut:
Contoh kode itu adalah ES6 dengan Express 4.16.x
sumber
Anda dapat mengekstrak parameter posting tanpa menggunakan express.
1:
nmp install multiparty
2: impor banyak pihak. sebagai
var multiparty = require('multiparty');
3: `
4: dan FORMULIR HTML IS.
Saya harap ini akan berhasil untuk Anda. Terima kasih.
sumber
Batasi ukuran POST agar tidak membanjiri aplikasi simpul Anda. Ada modul badan mentah yang bagus , cocok untuk mengekspresikan dan menghubungkan, yang dapat membantu Anda membatasi permintaan berdasarkan ukuran dan panjangnya.
sumber
Jika ini melibatkan pengunggahan file, browser biasanya mengirimkannya sebagai tipe
"multipart/form-data"
konten. Anda dapat menggunakan ini dalam kasus seperti ituReferensi 1
Referensi 2
sumber
Pada bidang formulir seperti ini
beberapa jawaban di atas akan gagal karena hanya mendukung data datar.
Untuk saat ini saya menggunakan jawaban Casey Chu tetapi dengan "qs" bukan modul "querystring". Ini juga menggunakan modul "body-parser" . Jadi jika Anda ingin data bersarang Anda harus menginstal qs.
Kemudian ganti baris pertama seperti:
sumber
Anda dapat dengan mudah mengirim dan mendapatkan respons permintaan POST dengan menggunakan "Permintaan - klien HTTP Sederhana" dan Javascript Promise.
sumber
Anda perlu menggunakan bodyParser () jika Anda ingin data formulir tersedia di req.body. body-parser mem-parsing permintaan Anda dan mengubahnya menjadi format yang dengannya Anda dapat dengan mudah mengekstrak informasi relevan yang mungkin Anda butuhkan.
Misalnya, katakanlah Anda memiliki formulir pendaftaran di frontend Anda. Anda mengisinya, dan meminta server untuk menyimpan detailnya di suatu tempat.
Mengekstrak nama pengguna dan kata sandi dari permintaan Anda sesederhana seperti di bawah ini jika Anda menggunakan body-parser.
…………………………………………………….
sumber
ONE LINER tanpa MIDDLEWARE
Jika Anda memposting data berikut,
'name':'ABC'
Maka Anda dapat menguraikannya menggunakan liner berikut,
sumber