express.json กับ bodyParser.json


115

ฉันกำลังเขียนแอพที่ค่อนข้างใหม่และสงสัยว่าฉันควรใช้ตัวไหน:

express.json()

หรือ

bodyParser.json()

ฉันสามารถสมมติว่าพวกเขาทำสิ่งเดียวกัน

ฉันต้องการใช้express.json()ตามที่มีอยู่แล้ว


express@4.17.1 ใช้ body-parser“ 1.19.0” เป็นตัวอ้างอิง
Tagi

คำตอบ:


260

Express เวอร์ชันก่อนหน้านี้เคยมีมิดเดิลแวร์จำนวนมากมาพร้อมกับมัน bodyParser เป็นหนึ่งในมิดเดิลแวร์ที่มา เมื่อ Express 4.0 เปิดตัวพวกเขาตัดสินใจที่จะลบมิดเดิลแวร์ที่แถมมาออกจาก Express และสร้างแพ็คเกจแยกกันแทน จากนั้นไวยากรณ์จะเปลี่ยนจากapp.use(express.json())เป็นapp.use(bodyParser.json())หลังจากติดตั้งโมดูล bodyParser

bodyParser ถูกเพิ่มกลับไปที่ Express ในรีลีส 4.16.0 เนื่องจากผู้คนต้องการให้มาพร้อมกับ Express เหมือนเมื่อก่อน นั่นหมายความว่าคุณไม่ต้องใช้bodyParser.json()อีกต่อไปหากคุณใช้รุ่นล่าสุด คุณสามารถใช้express.json()แทนได้

ประวัติความเป็นมาปล่อยเป็น 4.16.0 เป็นที่นี่สำหรับผู้ที่มีความสนใจและขอดึงที่นี่


3
เราสามารถทำได้app.use(express.urlencoded({ extended: true }));หรือไม่?
Robin Métral

3
อ่าใช่มันยังกล่าวถึงใน PR ที่คุณเชื่อมโยง เยี่ยมมาก!
Robin Métral

1
นั่นหมายความว่าพวกเขาทำงานเดียวกันหรือไม่?
GNETO DOMINIQUE

จะเกิดอะไรขึ้นถ้าฉันใช้ทั้ง // Data Parsing app.use (express.json ()); app.use (express.urlencoded ({ขยาย: เท็จ})); สบายดีไหม เพราะบทช่วยสอนใน youtube บอกให้ฉันใช้ทั้งสองอย่าง
rickvian

1
@rickvian - คุณสามารถใช้ทั้งสองอย่างได้หากต้องการ json ใช้สำหรับ JSON และ urlencoded สำหรับข้อมูลที่เข้ารหัส URL หากคุณเพิ่มทั้งสองอย่างคุณจะสามารถแยกวิเคราะห์ทั้งสองประเภทได้
Mika Sundland

15

ใช่! แก้ไข

var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');

var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'pug');

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', indexRouter);
app.use('/users', usersRouter);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  next(createError(404));
});

// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

module.exports = app;

32
แม้ว่าข้อมูลโค้ดนี้จะช่วยแก้ปัญหาได้ แต่การอธิบายจะช่วยปรับปรุงคุณภาพของโพสต์ของคุณได้มาก โปรดจำไว้ว่าคุณกำลังตอบคำถามสำหรับผู้อ่านในอนาคตและบุคคลเหล่านั้นอาจไม่ทราบสาเหตุของการแนะนำโค้ดของคุณ
Brett DeWoody

8

ใช่ทั้งสองเหมือนกัน

ถ้าคุณเข้าไปในไฟล์ node_module / express / lib / express.js

คุณสามารถดูได้ภายใต้โมดูลตัวแยกวิเคราะห์เนื้อหาที่อ้างอิงโมดูลถูกนำเข้าแล้ว

/**
 * Module dependencies.
 */

var bodyParser = require('body-parser')
//other modules

อ็อบเจ็กต์และเมธอดภายในโมดูล bodyparser สามารถเข้าถึงได้เมื่อเอ็กซ์พอร์ตโดยใช้อ็อบเจ็กต์โมดูลพิเศษ

exports = module.exports = createApplication;
exports.json = bodyParser.json

สิ่งนี้สามารถเข้าถึงได้จากวัตถุด่วนเพียงแค่โทร

express.json()

0

ใช่!! เนื่องจากความคิดเห็นอย่างกว้างขวางของผู้คนในการรวมตัวแยกวิเคราะห์ร่างกายกลับเข้ากับ Express รุ่นล่าสุดจึงทำเช่นนี้ คุณควรจะคิดว่าทั้งสองทำงานเหมือนกันนั่นคือการรับรู้วัตถุคำขอขาเข้าเป็นวัตถุ JSON อย่าลังเลที่จะใช้อย่างใดอย่างหนึ่ง


0

ใช่!! คุณสามารถใช้ทั้งสองอย่างได้ อย่างไรก็ตามเนื่องจากexpress.json()ตอนนี้มีอยู่แล้วexpressจึงควรใช้express.json()มากกว่าไฟล์bodyParser.json().

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