bodyParser เลิกใช้งานแล้ว express 4


398

ฉันใช้ express 4.0 และฉันรู้ว่า body parser ถูกนำออกจาก express core ฉันกำลังใช้การแทนที่ที่แนะนำ แต่ฉันได้รับ

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

ฉันจะหามิดเดิลแวร์ที่ควรจะอยู่ที่ไหน หรือฉันไม่ควรได้รับข้อผิดพลาดนี้?

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);

คำตอบ:


730

หมายความว่าการใช้ตัวbodyParser() สร้างได้ถูกคัดค้านณ วันที่ 2014-06-19

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

ตอนนี้คุณต้องโทรหาวิธีแยกกัน

app.use(bodyParser.urlencoded());

app.use(bodyParser.json());

และอื่น ๆ

หากคุณยังคงได้รับคำเตือนurlencodedคุณจำเป็นต้องใช้

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

extendedวัตถุสำคัญการตั้งค่าในขณะนี้จะต้องมีการส่งผ่านไปอย่างชัดเจนตั้งแต่ตอนนี้มีค่าเริ่มต้นไม่มี

หากคุณกำลังใช้ด่วน> = 4.16.0, parser ร่างกายได้รับการเพิ่มภายใต้วิธีการและexpress.json()express.urlencoded()


1
@eslammostafa คุณสามารถใช้ bodyparser ได้คุณไม่สามารถเรียกนวกรรมิกได้ คุณต้องโทรหาวิธีการของแต่ละคน
Ben Fortune

2
@ BenFortune ขอบคุณ Ben ฉันเข้าใจแล้วฉันแค่กังวลเรื่อง / tmp แต่ตอนนี้ฉันตรวจสอบอีกครั้งปัญหา / tmp เกิดขึ้นก็ต่อเมื่อเราใช้ bodyParser ในการแยกวิเคราะห์หลายรูปแบบandrewkelley.me/post/do-not-use -bodyparser-with-express-js.htmlฉันจะใช้ formidable แล้วสำหรับรูปแบบหลายส่วน
schehata

23
อะไรextendedทำอย่างไร
Camilo Martin

1
คำอธิบายของความแตกต่างจะเป็นประโยชน์ ฉันเห็นด้านล่างด้วยที่คุณสามารถใช้ทั้งสองอย่างได้ แต่ทำไม คุณควรพิจารณาเรื่องอะไรบ้าง
Harry Moreno

8
วิธีที่ดีที่สุดที่จะอธิบายขยายความจริงก็คือว่าไม่ได้ใช้วิธีการขยายที่ curl --data "user[email]=foo&user[password]=bar" localhost:3000/login จะได้รับจากเซิร์ฟเวอร์ในreq.bodyขณะที่{ user[email]: "foo", ...}ในขณะที่req.bodyจะมี{user: {email: "foo", ... }} extended: true
reed_de_la_mer

156

ต้องการคำเตือนเป็นศูนย์หรือไม่ ใช้มันแบบนี้:

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

คำอธิบาย : ค่าเริ่มต้นของextendedตัวเลือกถูกเลิกใช้งานซึ่งหมายความว่าคุณต้องผ่านค่าจริงหรือเท็จอย่างชัดเจน


1
ฉันใช้สิ่งนี้ยังคงได้รับข้อความ "body-parser เลิกใช้แล้ว" app.use(bodyParser.json()).use(bodyParser.urlencoded({ extended: true }));
Jeremy Thille

6
นั่นไม่ใช่วิธีการทำงาน คุณต้องใช้ app.use () แยกต่างหากสำหรับ json และ urlencoded
mr-karan

14

ในรุ่นด่วนเราต้องใช้:

app.use(express.bodyparser()); 

เพราะ body-parser เป็นตัวกลางระหว่างโหนดและ express ตอนนี้เราต้องใช้มันเหมือน:

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

ฉันคิดว่าคุณต้องการพูดว่า "body-parser เป็น middleware" หรือไม่? ด่วนไม่ได้เป็นมิดเดิลแวร์เท่าที่ฉันเข้าใจ
sakhunzai

9

หากคุณใช้ express> 4.16คุณสามารถใช้express.json()และexpress.urlencoded()

express.json()และexpress.urlencoded()มิดเดิ้ลได้รับการเพิ่มเพื่อให้ร่างกายร้องขอการสนับสนุนการแยกออกจากกล่อง สิ่งนี้ใช้expressjs/body-parserโมดูลโมดูลที่อยู่ด้านล่างดังนั้นแอพที่ต้องการโมดูลแยกต่างหากสามารถสลับไปใช้ตัวแยกวิเคราะห์ในตัวได้

Source Express 4.16.0 - วันที่วางจำหน่าย: 2017-09-28

ด้วยสิ่งนี้,

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

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

กลายเป็น,

const express = require('express');

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

8

body-parser เป็นชิ้นส่วนของมิดเดิลแวร์ด่วนที่อ่านอินพุตของฟอร์มและเก็บไว้เป็นวัตถุจาวาสคริปต์ที่สามารถเข้าถึงได้ผ่านreq.body 'body-parser' ที่ต้องติดตั้ง (ผ่านnpm install --save body-parser) สำหรับข้อมูลเพิ่มเติมดูที่: 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

เมื่อextendedมีการตั้งค่าเป็นจริงแล้วร่างกายกิ่ว (บีบอัด) จะพองตัว; เมื่อextendedถูกตั้งค่าเป็นเท็จร่างกายที่ถูกยุบจะถูกปฏิเสธ


2

ความคิดเห็นของคุณคือการใช้เครื่องกำเนิดไฟฟ้าด่วนมันจะสร้างโครงกระดูกเริ่มต้นด้วยwithout deprecated messagesปรากฏในบันทึกของคุณ

เรียกใช้คำสั่งนี้

npm install express-generator -g

ตอนนี้สร้างแอปพลิเคชันเริ่มต้น Express.js ใหม่โดยพิมพ์คำสั่งyour Node projects folderนี้

express node-express-app

ว่าคำสั่ง tell ด่วนในการสร้างแอปพลิเค Node.js node-express-appใหม่ที่มีชื่อ

แล้วGo to the newly created project directory, install npm packagesและstart the appใช้คำสั่ง

cd node-express-app && npm install && npm start

1

ฉันพบว่าในขณะที่เพิ่ม

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

ช่วยในบางครั้งมันเป็นเรื่องของการสอบถามของคุณที่กำหนดว่า express จัดการกับมันอย่างไร

ตัวอย่างเช่นอาจเป็นไปได้ว่าพารามิเตอร์ของคุณถูกส่งผ่านในURLแทนที่จะเป็นเนื้อหา

ในกรณีเช่นนี้คุณต้องจับทั้งพารามิเตอร์bodyและurlและใช้ค่าใด ๆ ที่มีอยู่ (พร้อมค่าพารามิเตอร์ร่างกายในกรณีด้านล่าง)

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

-1

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

ฉันมีปัญหาเดียวกัน แต่การทำงานนี้สำหรับฉัน คุณสามารถลองชิ้นส่วนเพิ่มเติมนี้ได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.