Trình phân tích cú pháp cơ thể làm gì với express?


337

Tôi không hiểu tại sao chúng ta cần body-parsertrong ứng dụng Express, vì chúng ta có thể lấy dữ liệu mà không cần sử dụng body-parser. Và nó làm gì thực sự và làm thế nào?


54
để đọc dữ liệu POST HTTP, chúng ta phải sử dụng mô-đun nút "body-Parser". body-Parser là một phần của phần mềm trung gian cấp tốc đọc đầu vào của biểu mẫu và lưu trữ dưới dạng đối tượng javascript có thể truy cập thông quareq.body
tái cấu trúc

2
Với express bạn có thể đọc bất kỳ dữ liệu nào trong yêu cầu HTTP, chẳng hạn như các tiêu đề req.headers(mảng), bạn có thể đọc phần thân của gói http như được req.bodygiải thích bởi @CleanCrispCode và bạn có thể đọc như một tham số truy vấn req.query.variable, Nó giúp tự động chuyển đổi yêu cầu trong javascript đối tượng
Fernando Zamperin

3
@refactor - đây có thể là một trong nhiều lý do chúng ta phải sử dụng trình phân tích cú pháp cơ thể, nhưng nó không nói rõ nó làm gì, tức là các đối tượng yêu cầu và phản hồi HTTP là các luồng và chúng không thể 'đọc được' như một đối tượng giống như res.bodykhông có toàn bộ luồng được đệm vào res.bodyđầu tiên.
ortonomy

1
Với phiên bản Express 4.16+, họ đã bao gồm phiên bản trình phân tích cú pháp cơ thể của riêng họ được tích hợp để bạn không phải kéo gói này.
StefanBob

Câu trả lời:


254

Để xử lý HTTP POSTyêu cầu trong Express.js phiên bản 4 trở lên, bạn cần cài đặt mô-đun phần mềm trung gian được gọi body-parser.

body-parsertrích xuất toàn bộ phần cơ thể của luồng yêu cầu đến và hiển thị nó trên req.body.

Phần mềm trung gian là một phần của Express.js trước đây nhưng bây giờ bạn phải cài đặt riêng.

body-parserMô-đun này phân tích cú pháp mã hóa JSON, bộ đệm, chuỗi và URL được gửi bằng HTTP POSTyêu cầu. Cài đặt body-parserbằng NPM như hình bên dưới.

npm install body-parser --save

chỉnh sửa vào năm 2019-april-2: in express@4.16.0 phần mềm trung gian phân tích cú pháp cơ thể đi kèm với express. để biết thêm chi tiết xem điều này


125
Đây hoàn toàn có thể là điều tồi tệ nhất. Tại sao các nhà phát triển cốt lõi Express lại gây khó khăn cho những người mới tham gia bằng cách bắt họ cài đặt phần mềm trung gian bổ sung cho các trường hợp sử dụng phổ biến nhất trong phát triển web?
elmt

5
@elmt nếu bạn muốn một cái gì đó có ý kiến, hãy thử sails.js
George

1
@ user1063287 đúng vậy. urlencoded()json()thực sự là các nhà máy sản xuất phần mềm trung gian trả về chức năng phần mềm trung gian gọi ranext()
Nick Manning

3
Nó không phải là khập khiễng @elmt, nút không chỉ dành cho web, nó có thể được sử dụng trên máy tính để bàn, thiết bị di động, v.v. và trong những trường hợp này, nó không phải là một mô-đun cần thiết. Nút có thể thích ứng với ứng dụng của bạn mà không có bất kỳ trách nhiệm pháp lý nào
fnaquira

27
@fnaquira - Bạn đang bối rối. Đây là về express không phải nút.
elmt

84

Vâng, chúng tôi có thể làm việc mà không cần body-parser. Khi bạn không sử dụng mà bạn nhận được yêu cầu thô và cơ thể và các tiêu đề của bạn không nằm trong đối tượng gốc của tham số yêu cầu. Bạn sẽ phải thao tác cá nhân tất cả các lĩnh vực.

Hoặc bạn có thể sử dụng body-parser, vì nhóm thể hiện đang duy trì nó.

Những gì trình phân tích cú pháp cơ thể có thể làm cho bạn: Nó đơn giản hóa yêu cầu.
Cách sử dụng: Dưới đây là ví dụ:

Tải về npm install body-parser --save

Đây là cách sử dụng trình phân tích cú pháp cơ thể trong 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 }));

Liên kết.

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

Và sau đó bạn có thể nhận được phần thân và phần đầu trong đối tượng yêu cầu root. Thí dụ

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

3
Xin cảm ơn về thông tin này, bạn có thể đăng một ví dụ mã mà không cần trình phân tích cú pháp cơ thể không?
Ilyas karim

55

Câu trả lời ở đây giải thích rất chi tiết và xuất sắc, câu trả lời chứa:

Nói ngắn gọn; trình phân tích cú pháp cơ thể trích xuất toàn bộ phần cơ thể của luồng yêu cầu đến và hiển thị nó req.bodynhư một thứ dễ dàng hơn để giao tiếp. Bạn không cần nó mỗi lần, bởi vì bạn có thể tự mình làm tất cả. Tuy nhiên, rất có thể nó sẽ làm những gì bạn muốn và cứu bạn khỏi những rắc rối.


Để đi sâu hơn một chút; body-Parser cung cấp cho bạn một phần mềm trung gian sử dụng nodejs / zlib để giải nén dữ liệu yêu cầu đến nếu nó được nén và luồng-utils / raw-body để chờ toàn bộ nội dung thô của thân yêu cầu trước khi "phân tích cú pháp" (điều này có nghĩa là nếu bạn sẽ không sử dụng cơ thể yêu cầu, bạn chỉ lãng phí một chút thời gian).

Sau khi có nội dung thô, trình phân tích cú pháp cơ thể sẽ phân tích cú pháp bằng một trong bốn chiến lược, tùy thuộc vào phần mềm trung gian cụ thể mà bạn quyết định sử dụng:

  • bodyParser.raw () : Không thực sự phân tích cơ thể, mà chỉ hiển thị nội dung được đệm từ trước trong Bộ đệm trên req.body.

  • bodyParser.text () : Đọc bộ đệm dưới dạng văn bản thuần túy và hiển thị chuỗi kết quả trên req.body.

  • bodyParser.urlencoding () : Phân tích văn bản dưới dạng dữ liệu được mã hóa URL (đó là cách trình duyệt có xu hướng gửi dữ liệu biểu mẫu từ biểu mẫu thông thường được đặt thành POST) và hiển thị đối tượng kết quả (chứa khóa và giá trị) trên req.body. Để so sánh; trong PHP tất cả điều này được tự động thực hiện và hiển thị trong $_POST.

  • bodyParser.json () : Phân tích văn bản dưới dạng JSON và hiển thị đối tượng kết quả trên req.body.

Chỉ sau khi đặt req.bodynội dung mong muốn, nó mới gọi phần mềm trung gian tiếp theo trong ngăn xếp, sau đó có thể truy cập dữ liệu yêu cầu mà không phải suy nghĩ về cách giải nén và phân tích cú pháp.

Bạn có thể tham khảo github body-Parser để đọc tài liệu của họ, nó chứa thông tin liên quan đến hoạt động của nó.


47

Hãy cố gắng giữ điều này ít kỹ thuật nhất.

Giả sử bạn đang gửi dữ liệu biểu mẫu html đến máy chủ của nút-js, tức là bạn đã yêu cầu đến máy chủ. Tệp máy chủ sẽ nhận được yêu cầu của bạn theo một đối tượng yêu cầu. Bây giờ theo logic, nếu bạn điều khiển đăng nhập đối tượng yêu cầu này trong tệp máy chủ của bạn, bạn sẽ thấy dữ liệu biểu mẫu của mình ở đâu đó trong đó, có thể được trích xuất sau đó, nhưng whoa! bạn thực sự không!

Vậy, dữ liệu của chúng ta ở đâu? Làm thế nào chúng tôi sẽ giải nén nó nếu nó không chỉ xuất hiện trong yêu cầu của tôi.

Giải thích đơn giản cho điều này là http gửi dữ liệu biểu mẫu của bạn theo bit và phần được dự định sẽ được lắp ráp khi chúng đến đích. Vì vậy, làm thế nào bạn sẽ trích xuất dữ liệu của bạn.

Nhưng, tại sao phải chịu nỗi đau này mỗi khi phân tích thủ công dữ liệu của bạn cho các khối và lắp ráp nó. Sử dụng một cái gì đó gọi là cơ thể-trình phân tích cú pháp, sẽ làm điều này cho bạn.

body-Parser phân tích cú pháp yêu cầu của bạn và chuyển đổi nó thành định dạng mà từ đó bạn có thể dễ dàng trích xuất thông tin liên quan mà bạn có thể cần.

Ví dụ: giả sử bạn có một mẫu đăng ký tại lối vào của bạn. Bạn đang điền nó và yêu cầu máy chủ lưu các chi tiết ở đâu đó.

Trích xuất tên người dùng và mật khẩu từ yêu cầu của bạn sẽ đơn giản như dưới đây nếu bạn sử dụng trình phân tích cú pháp cơ thể.

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

Vì vậy, về cơ bản, trình phân tích cú pháp cơ thể đã phân tích yêu cầu đến của bạn, tập hợp các khối chứa dữ liệu biểu mẫu của bạn, sau đó tạo đối tượng cơ thể này cho bạn và điền vào dữ liệu biểu mẫu của bạn.


10

Nó phân tích cơ thể yêu cầu HTTP. Điều này thường là cần thiết khi bạn cần biết nhiều hơn chỉ là URL bạn nhấn, cụ thể là trong bối cảnh yêu cầu HTTP POST hoặc PUT PATCH nơi chứa thông tin bạn muốn chứa trong phần thân.

Về cơ bản, nó là một phần mềm trung gian để phân tích cú pháp JSON, văn bản thuần túy hoặc chỉ trả về một đối tượng Bộ đệm thô để bạn xử lý khi bạn yêu cầu.


8

Để có được quyền truy cập vào dữ liệu bài đăng, chúng tôi phải sử dụng body-parser. Về cơ bản những gì body-parsercho phép thể hiện để đọc cơ thể và sau đó phân tích nó thành một Jsonđối tượng mà chúng ta có thể hiểu.


7

Đây là tất cả một vấn đề thuận tiện.

Về cơ bản, nếu câu hỏi là 'Chúng ta có cần sử dụng body-parserkhông?' Câu trả lời là không'. Chúng tôi có thể đưa ra cùng một thông tin từ yêu cầu bài của khách hàng bằng cách sử dụng một tuyến có nhiều mạch hơn, thường sẽ kém linh hoạt hơn và sẽ tăng số lượng mã chúng tôi phải viết để có được thông tin tương tự.

Điều này giống như hỏi 'Chúng ta có cần sử dụng khôngexpress để bắt đầu không?' Một lần nữa, câu trả lời là không, và một lần nữa, thực sự tất cả là nhờ tiết kiệm cho chúng tôi những rắc rối khi viết thêm mã để làm những điều cơ bản thể hiện đi kèm với 'tích hợp'.

Nhìn bề ngoài - body-parsergiúp dễ dàng lấy thông tin trong các yêu cầu của khách hàng ở nhiều định dạng thay vì khiến bạn nắm bắt các luồng dữ liệu thô và tìm ra định dạng của thông tin, ít phân tích thông tin đó thành dữ liệu có thể sử dụng.


6

Hiểu cơ thể yêu cầu

Khi nhận được yêu cầu POST hoặc PUT, phần yêu cầu có thể quan trọng đối với ứng dụng của bạn. Lấy dữ liệu cơ thể có liên quan nhiều hơn một chút so với truy cập các tiêu đề yêu cầu. Đối tượng yêu cầu được chuyển đến một trình xử lý thực hiện giao diện ReadableStream. Luồng này có thể được nghe hoặc dẫn ở nơi khác giống như bất kỳ luồng nào khác. Chúng ta có thể lấy dữ liệu ra khỏi luồng bằng cách lắng nghe các sự kiện 'dữ liệu' và 'kết thúc' của luồng.

Đoạn phát ra trong mỗi sự kiện 'dữ liệu' là Bộ đệm. Nếu bạn biết đó sẽ là dữ liệu chuỗi, điều tốt nhất cần làm là thu thập dữ liệu trong một mảng, sau đó ở phần cuối ', nối và xâu chuỗi nó.

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

Hiểu về trình phân tích cú pháp cơ thể

Theo tài liệu của nó

Phân tích các cơ quan yêu cầu đến trong một phần mềm trung gian trước các trình xử lý của bạn, có sẵn trong thuộc tính req.body.

Như bạn đã thấy trong ví dụ đầu tiên, chúng tôi phải phân tích luồng yêu cầu đến bằng tay để trích xuất phần thân. Điều này trở nên tẻ nhạt khi có nhiều dữ liệu dạng khác nhau. Vì vậy, chúng tôi sử dụng gói trình phân tích cú pháp cơ thể thực hiện tất cả nhiệm vụ này dưới mui xe.

Nó cung cấp bốn mô-đun để phân tích các loại dữ liệu khác nhau

Sau khi có trình phân tích cú pháp nội dung thô sẽ sử dụng một trong các chiến lược trên (tùy thuộc vào phần mềm trung gian bạn quyết định sử dụng) để phân tích dữ liệu. Bạn có thể đọc thêm về họ bằng cách đọc tài liệu của họ.

Sau khi thiết lập phần req.bodythân được phân tích cú pháp, trình phân tích cú pháp cơ thể sẽ gọi next()để gọi phần mềm trung gian tiếp theo xuống ngăn xếp, sau đó có thể truy cập dữ liệu yêu cầu mà không phải suy nghĩ về cách giải nén và phân tích cú pháp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.