bodyParser sudah usang express 4

398

Saya menggunakan express 4.0 dan saya sadar bahwa body parser telah dikeluarkan dari inti express, saya menggunakan pengganti yang disarankan, namun saya mendapatkan

body-parser deprecated bodyParser: use individual json/urlencoded middlewares server.js:15:12 body-parser deprecated urlencoded: explicitly specify "extended: true" for extended parsing node_modules/body-parser/index.js:74:29

Di mana saya menemukan ini middlewares? atau haruskah saya tidak mendapatkan kesalahan ini?

var express     = require('express');
var server      = express();
var bodyParser  = require('body-parser');
var mongoose    = require('mongoose');
var passport    = require('./config/passport');
var routes      = require('./routes');

mongoose.connect('mongodb://localhost/myapp', function(err) {
    if(err) throw err;
});

server.set('view engine', 'jade');
server.set('views', __dirname + '/views');

server.use(bodyParser()); 
server.use(passport.initialize());

// Application Level Routes
routes(server, passport);

server.use(express.static(__dirname + '/public'));

server.listen(3000);
Melbourne2991
sumber

Jawaban:

730

Ini berarti bahwa menggunakan bodyParser() konstruktor telah ditinggalkan , pada 2014-06-19.

app.use(bodyParser()); //Now deprecated

Anda sekarang perlu memanggil metode secara terpisah

app.use(bodyParser.urlencoded());

app.use(bodyParser.json());

Dan seterusnya.

Jika Anda masih mendapatkan peringatan dengan urlencodedyang perlu Anda gunakan

app.use(bodyParser.urlencoded({
  extended: true
}));

The extendedkey objek config sekarang perlu secara eksplisit berlalu, karena sekarang tidak memiliki nilai default.

Jika Anda menggunakan Express> = 4.16.0, body parser telah ditambahkan kembali di bawah metode express.json()dan express.urlencoded().

Ben Fortune
sumber
1
@ Eslammostafa Anda dapat menggunakan bodyparser, Anda tidak bisa memanggil konstruktor. Anda perlu memanggil setiap metode individual.
Ben Fortune
2
@BenFortune terima kasih Ben, saya mengerti, saya hanya khawatir tentang hal / tmp, tapi sekarang saya memeriksa lagi, masalah / tmp hanya terjadi jika kita menggunakan bodyParser untuk mengurai bentuk multi-bagian, danrewkelley.me/post/do-not-use -bodyparser-with-express-js.html saya akan menggunakan formidable untuk bentuk multipart.
schehata
23
Apa yang extendedharus dilakukan
Camilo Martin
1
penjelasan tentang perbedaan akan sangat membantu. Saya juga melihat di bawah ini bahwa Anda bisa menggunakan keduanya. Tapi kenapa? Pertimbangan apa yang harus Anda buat?
Harry Moreno
8
Cara terbaik yang saya jelaskan diperpanjang benar adalah bahwa tidak menggunakan cara diperpanjang yang curl --data "user[email]=foo&user[password]=bar" localhost:3000/login akan diterima oleh server di req.bodysebagai { user[email]: "foo", ...}sedangkan req.bodyakan {user: {email: "foo", ... }}dengan extended: true.
reed_de_la_mer
156

Ingin nol peringatan ? Gunakan seperti ini:

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
  extended: true
}));

Penjelasan : Nilai default extendedopsi telah usang, artinya Anda harus secara eksplisit memberikan nilai true atau false.

smajl
sumber
1
Saya menggunakan ini, masih mendapatkan pesan "body-parser deprecated". app.use(bodyParser.json()).use(bodyParser.urlencoded({ extended: true }));
Jeremy Thille
6
Itu bukan cara kerjanya. Anda perlu menggunakan app.use () secara terpisah untuk json dan urlencoded
mr-karan
14

Di versi express yang lebih lama, kami harus menggunakan:

app.use(express.bodyparser()); 

karena body-parser adalah middleware antara node dan express. Sekarang kita harus menggunakannya seperti:

app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
himanshu yadav
sumber
Saya pikir Anda ingin mengatakan "pengurai tubuh adalah middleware"? express bukan middleware seperti yang saya mengerti
sakhunzai
9

Jika Anda menggunakan express> 4.16, Anda dapat menggunakan express.json()danexpress.urlencoded()

The express.json()dan express.urlencoded()middleware telah ditambahkan untuk memberikan permintaan tubuh dukungan parsing out-of-the-box. Ini menggunakan expressjs/body-parsermodul modul di bawahnya, sehingga aplikasi yang saat ini membutuhkan modul secara terpisah dapat beralih ke pengurai bawaan.

Source Express 4.16.0 - Tanggal rilis: 2017-09-28

Dengan ini,

const bodyParser  = require('body-parser');

app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());

menjadi,

const express = require('express');

app.use(express.urlencoded({ extended: true }));
app.use(express.json());
Sridhar
sumber
8

body-parser adalah bagian dari middleware ekspres yang membaca input formulir dan menyimpannya sebagai objek javascript yang dapat diakses melalui req.body 'body-parser' harus diinstal (melalui npm install --save body-parser) Untuk info lebih lanjut lihat: https://github.com/expressjs/body -parser

   var bodyParser = require('body-parser');
   app.use(bodyParser.json()); // support json encoded bodies
   app.use(bodyParser.urlencoded({ extended: true })); // support encoded bodies

Ketika extendeddisetel ke true, tubuh yang dikempiskan (dikompres) akan meningkat; ketika extendeddisetel ke false, tubuh yang kempes ditolak.

Parth Raval
sumber
2

Apa pendapat Anda untuk menggunakan generator kilat yang akan menghasilkan proyek kerangka untuk memulai, without deprecated messagesmuncul di log Anda

jalankan perintah ini

npm install express-generator -g

Sekarang, buat aplikasi pemula Express.js baru dengan mengetikkan perintah ini di your Node projects folder.

express node-express-app

Perintah itu memberitahu express untuk membuat aplikasi Node.js baru dengan nama node-express-app.

lalu Go to the newly created project directory, install npm packagesdan start the appmenggunakan perintah

cd node-express-app && npm install && npm start
Basheer AL-MOMANI
sumber
1

Saya menemukan itu sambil menambahkan

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
  extended: true
}));

membantu, kadang-kadang masalah pertanyaan Anda yang menentukan bagaimana express menanganinya.

Misalnya, bisa jadi parameter Anda diteruskan di URL daripada di badan

Dalam kasus seperti itu, Anda perlu menangkap parameter body dan url dan menggunakan mana yang tersedia (dengan preferensi untuk parameter body dalam kasus di bawah ini)

app.route('/echo')
    .all((req,res)=>{
        let pars = (Object.keys(req.body).length > 0)?req.body:req.query;
        res.send(pars);
    });
Ian Mbae
sumber
-1

app.use(bodyParser.urlencoded({extended: true}));

Saya memiliki masalah yang sama tetapi ini bekerja untuk saya. Anda dapat mencoba bagian yang diperluas ini.

Mehedi Abdullah
sumber