Apa yang dilakukan body-parser dengan express?


339

Saya tidak mengerti mengapa kami membutuhkan body-parseraplikasi Express, karena kami bisa mendapatkan data tanpa menggunakan body-parser. Dan apa fungsinya sebenarnya dan bagaimana?


54
untuk membaca data HTTP POST, kita harus menggunakan modul simpul "body-parser". body-parser adalah sepotong middleware ekspres yang membaca input formulir dan menyimpannya sebagai objek javascript yang dapat diakses melaluireq.body
refactor

2
Dengan express Anda dapat membaca data apa pun di dalam permintaan HTTP, seperti header req.headers(array), Anda dapat membaca isi paket http seperti yang req.bodydijelaskan oleh @CleanCrispCode dan Anda dapat membaca sebagai parameter kueri req.query.variable, ini membantu karena express secara otomatis mengubah permintaan dalam javascript benda
Fernando Zamperin

3
@refactor - ini mungkin salah satu dari banyak alasan kita harus menggunakan parser tubuh, tetapi tidak mengatakan apa yang dilakukannya, yaitu bahwa permintaan HTTP dan objek respons adalah aliran dan bahwa mereka tidak 'dapat dibaca' sebagai objek tunggal seperti res.bodytanpa seluruh aliran buffered menjadi yang res.bodypertama.
ortonomy

1
Dengan Express versi 4.16+ mereka telah menyertakan versi body-parser bawaan mereka sehingga Anda tidak perlu menarik paket ini.
StefanBob

Jawaban:


255

Untuk menangani HTTP POSTpermintaan di Express.js versi 4 dan di atas, Anda perlu menginstal modul middleware yang disebut body-parser.

body-parserekstrak seluruh bagian tubuh dari aliran permintaan yang masuk dan paparkan pada req.body.

Middleware adalah bagian dari Express.js sebelumnya tetapi sekarang Anda harus menginstalnya secara terpisah.

body-parserModul ini mem-parsing data yang disandikan JSON, buffer, string, dan URL yang dikirimkan menggunakan HTTP POSTpermintaan. Instal body-parsermenggunakan NPM seperti yang ditunjukkan di bawah ini.

npm install body-parser --save

sunting di 2019-april-2: di express@4.16.0 middleware body-parser yang dibundel dengan express. untuk lebih jelasnya lihat ini


126
Ini mungkin adalah hal paling lemah yang pernah ada. Mengapa Express core devs membuat sangat sulit bagi pendatang baru untuk bergabung dengan membuat mereka menginstal middleware tambahan untuk kasus penggunaan paling umum dalam pengembangan web?
elmt

5
@elmt jika Anda menginginkan sesuatu dengan pendapat, coba sails.js
George

1
@ user1063287 ya itu. urlencoded()dan json()sebenarnya pabrik middleware yang mengembalikan fungsi middleware yang memanggilnext()
Nick Manning

3
Ini bukan lame @elmt, node tidak hanya untuk web, ia dapat digunakan di desktop, ponsel, dll, dan dalam kasus ini bukan modul yang diperlukan. Node dapat beradaptasi dengan aplikasi Anda tanpa kewajiban apa pun
fnaquira

28
@fnaquira - Anda bingung. Ini tentang express bukan node.
elmt

85

Ya kita bisa bekerja tanpanya body-parser. Ketika Anda tidak menggunakannya, Anda mendapatkan permintaan mentah, dan tubuh serta header Anda tidak berada di objek root dari parameter permintaan. Anda harus memanipulasi semua bidang secara individual.

Atau Anda dapat menggunakannya body-parser, karena tim ekspres memeliharanya.

Apa yang bisa dilakukan oleh body-parser untuk Anda: Ini menyederhanakan permintaan.
Cara menggunakannya: Berikut ini contohnya:

Install npm install body-parser --save

Ini cara menggunakan body-parser di express:

const express = require('express'),
      app = express(),
      bodyParser = require('body-parser');

// support parsing of application/json type post data
app.use(bodyParser.json());

//support parsing of application/x-www-form-urlencoded post data
app.use(bodyParser.urlencoded({ extended: true }));

Tautan.

https://github.com/expressjs/body-parser .

Dan kemudian Anda bisa mendapatkan tubuh dan header di objek permintaan root. Contoh

app.post("/posturl",function(req,res,next){
    console.log(req.body);
    res.send("response");
})

3
Hai terima kasih untuk informasinya, dapatkah Anda memposting contoh kode tanpa parser tubuh?
Ilyas karim

55

Jawabannya di sini menjelaskannya dengan sangat terperinci dan cemerlang, jawabannya berisi:

Pendeknya; body-parser mengekstrak seluruh bagian tubuh dari aliran permintaan yang masuk dan memaparkannya req.bodysebagai sesuatu yang lebih mudah untuk berinteraksi. Anda tidak memerlukannya sendiri, karena Anda bisa melakukan semua itu sendiri. Namun, kemungkinan besar akan melakukan apa yang Anda inginkan dan menyelamatkan Anda dari masalah.


Untuk sedikit lebih dalam; body-parser memberi Anda middleware yang menggunakan nodejs / zlib untuk meng-unzip data permintaan yang masuk jika zip dan stream-utils / raw-body untuk menunggu isi penuh, isi mentah dari tubuh permintaan sebelum "parsing" (ini berarti bahwa jika Anda tidak akan menggunakan badan permintaan, Anda hanya membuang waktu).

Setelah memiliki konten mentah, body-parser akan menguraikannya menggunakan salah satu dari empat strategi, tergantung pada middleware spesifik yang Anda putuskan untuk digunakan:

  • bodyParser.raw () : Tidak benar-benar mem-parsing tubuh, tetapi hanya memaparkan konten buffered dari sebelumnya dalam Buffer aktif req.body.

  • bodyParser.text () : Membaca buffer sebagai teks biasa dan memperlihatkan string yang dihasilkan pada req.body.

  • bodyParser.urlencoded () : Mem-parsing teks sebagai data yang disandikan URL (yang merupakan cara browser cenderung mengirim data formulir dari formulir biasa yang diatur ke POST) dan memaparkan objek yang dihasilkan (berisi kunci dan nilai) pada req.body. Untuk perbandingan; di PHP semua ini dilakukan secara otomatis dan diekspos di $_POST.

  • bodyParser.json () : Mem-parsing teks sebagai JSON dan mengekspos objek yang dihasilkan req.body.

Hanya setelah mengatur req.bodyke konten yang diinginkan itu akan memanggil middleware berikutnya di stack, yang kemudian dapat mengakses data permintaan tanpa harus memikirkan cara unzip dan mengurai itu.

Anda dapat merujuk ke body-parser github untuk membaca dokumentasinya, berisi informasi tentang cara kerjanya.


47

Mari kita coba untuk menjaga ini paling tidak teknis.

Katakanlah Anda mengirim data formulir html ke server node-js yaitu Anda membuat permintaan ke server. File server akan menerima permintaan Anda di bawah objek permintaan. Sekarang dengan logika, jika Anda konsol mencatat objek permintaan ini di file server Anda, Anda akan melihat data formulir Anda di suatu tempat di dalamnya, yang dapat diekstraksi kemudian, tetapi whoa! kamu sebenarnya tidak!

Jadi, di mana data kami? Bagaimana kami mengekstraknya jika tidak hanya ada dalam permintaan saya.

Penjelasan sederhana untuk ini adalah http mengirimkan data formulir Anda dalam potongan-potongan yang dimaksudkan untuk dirakit ketika mereka mencapai tujuan mereka. Jadi bagaimana Anda mengekstrak data Anda.

Tapi, mengapa perlu kesusahan ini setiap kali secara manual mengurai data Anda untuk potongan dan merakitnya. Gunakan sesuatu yang disebut "body-parser" yang akan melakukan ini untuk Anda.

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 di bawah ini jika Anda menggunakan body-parser.

var loginDetails = {    
    username : request.body.username,    
    password : request.body.password    
};

Jadi pada dasarnya, body-parser mem-parsing permintaan masuk Anda, mengumpulkan potongan-potongan yang berisi data formulir Anda, lalu membuat objek tubuh ini untuk Anda dan mengisinya dengan data formulir Anda.


10

Itu mem-parsing badan permintaan HTTP. Ini biasanya diperlukan ketika Anda perlu tahu lebih dari sekadar URL yang Anda tekan, khususnya dalam konteks permintaan HTTP POST atau PUT PATCH di mana informasi yang Anda inginkan ada di dalam tubuh.

Pada dasarnya ini adalah middleware untuk mem-parsing JSON, teks biasa, atau hanya mengembalikan objek Buffer mentah untuk Anda tangani sesuai kebutuhan.


8

Untuk mendapatkan akses ke data postingan kita harus menggunakan body-parser. Pada dasarnya apa body-parseryang memungkinkan express untuk membaca tubuh dan kemudian menguraikannya menjadi Jsonobjek yang bisa kita pahami.


7

Ini semua masalah kenyamanan.

Pada dasarnya, jika pertanyaannya adalah 'Apakah kita perlu menggunakan body-parser?' Jawabannya adalah tidak'. Kita dapat menghasilkan informasi yang sama dari klien-pasca-permintaan menggunakan rute yang lebih berputar yang umumnya akan kurang fleksibel dan akan meningkatkan jumlah kode yang harus kita tulis untuk mendapatkan informasi yang sama.

Ini sama dengan bertanya, "Apakah kita perlu menggunakan expressuntuk memulainya?" Sekali lagi, jawabannya tidak ada, dan sekali lagi, benar-benar semuanya berujung pada menyelamatkan kita dari kerumitan menulis lebih banyak kode untuk melakukan hal-hal dasar yang mengekspresikan dilengkapi dengan 'built-in'.

Di permukaan - body-parserbuatlah lebih mudah untuk mendapatkan informasi yang terkandung dalam permintaan klien dalam berbagai format alih-alih membuat Anda menangkap aliran data mentah dan mencari tahu dalam format apa informasi itu berada, apalagi secara manual memilah informasi itu menjadi data yang bisa digunakan.


6

Memahami Badan Permintaan

Saat menerima permintaan POST atau PUT, badan permintaan mungkin penting bagi aplikasi Anda. Mendapatkan data tubuh sedikit lebih terlibat daripada mengakses header permintaan. Objek permintaan yang diteruskan ke pawang mengimplementasikan antarmuka ReadableStream. Aliran ini dapat didengarkan atau disalurkan ke tempat lain sama seperti aliran lainnya. Kami dapat mengambil data langsung dari aliran dengan mendengarkan 'data' dan acara 'akhir' streaming.

Potongan yang dipancarkan dalam setiap acara 'data' adalah Penyangga. Jika Anda tahu itu akan menjadi data string, hal terbaik yang harus dilakukan adalah mengumpulkan data dalam sebuah array, kemudian pada 'akhir', menyatukan dan mengencangkannya.

let body = [];
request.on('data', (chunk) => {
  body.push(chunk);
}).on('end', () => {
  body = Buffer.concat(body).toString();
  // at this point, `body` has the entire request body stored in it as a string
});

Memahami body-parser

Sesuai dokumentasinya

Parsing badan permintaan masuk di middleware sebelum penangan Anda, tersedia di bawah properti req.body.

Seperti yang Anda lihat pada contoh pertama, kami harus mengurai aliran permintaan masuk secara manual untuk mengekstrak tubuh. Ini menjadi sedikit membosankan ketika ada beberapa bentuk data dari tipe yang berbeda. Jadi kami menggunakan paket body-parser yang melakukan semua tugas ini di bawah tenda.

Ini menyediakan empat modul untuk mengurai berbagai jenis data

Setelah memiliki isi mentah body-parser akan menggunakan salah satu dari strategi di atas (tergantung pada middleware yang Anda putuskan untuk digunakan) untuk mengurai data. Anda dapat membaca lebih lanjut tentang mereka dengan membaca dokumentasinya.

Setelah mengatur req.bodyke badan yang diuraikan, body-parser akan memanggil next()untuk memanggil middleware berikutnya di tumpukan, yang kemudian dapat mengakses data permintaan tanpa harus memikirkan bagaimana cara unzip dan menguraikannya.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.