Làm cách nào để truy cập vào phần thân yêu cầu khi POST bằng Node.js và Express?


174

Tôi có mã Node.js sau:

var express = require('express');
var app = express.createServer(express.logger());
app.use(express.bodyParser());

app.post('/', function(request, response) {
    response.write(request.body.user);
    response.end();
});

Bây giờ nếu tôi gửi một cái gì đó như:

curl -d user=Someone -H Accept:application/json --url http://localhost:5000

Tôi nhận được Someonenhư mong đợi. Bây giờ, nếu tôi muốn có được cơ thể yêu cầu đầy đủ thì sao? Tôi đã thử làm response.write(request.body)nhưng Node.js đưa ra một ngoại lệ nói rằng " đối số đầu tiên phải là một chuỗi hoặc Bộ đệm " sau đó chuyển đến "vòng lặp vô hạn" với một ngoại lệ có nội dung " Không thể đặt tiêu đề sau khi chúng được gửi. "; Điều này cũng đúng ngay cả khi tôi đã làm var reqBody = request.body;và sau đó viết response.write(reqBody).

Vấn đề ở đây là gì?

Ngoài ra, tôi chỉ có thể nhận được yêu cầu thô mà không cần sử dụng express.bodyParser()?


Dường như có một cái gì đó với response.write(reqBody); Khi tôi sử dụng response.send(reqBody)mọi thứ đang hoạt động tốt ... và vâng, tôi sử dụng response.endsau response.write.
TheBlueSky

Câu trả lời:


161

Thể hiện 4.0 trở lên:

$ npm install --save body-parser

Và sau đó trong ứng dụng nút của bạn:

const bodyParser = require('body-parser');
app.use(bodyParser);

Express 3.0 trở xuống:

Hãy thử chuyển cái này trong cuộc gọi cURL của bạn:

--header "Content-Type: application/json"

và đảm bảo dữ liệu của bạn ở định dạng JSON:

{"user":"someone"}

Ngoài ra, bạn có thể sử dụng console.dir trong mã node.js của mình để xem dữ liệu bên trong đối tượng như trong ví dụ sau:

var express = require('express');
var app = express.createServer();

app.use(express.bodyParser());

app.post('/', function(req, res){
    console.dir(req.body);
    res.send("test");
}); 

app.listen(3000);

Câu hỏi khác này cũng có thể giúp: Làm thế nào để nhận JSON trong yêu cầu POST của nút node.js?

Nếu bạn không muốn sử dụng bodyParser, hãy xem câu hỏi khác này: https://stackoverflow.com/a/9920700/446681


Tôi đã thử sử dụng curl -d {"user":"Someone"} -H "Content-Type: application/json" --url http://localhost:5000nhưng nó đã gây ra lỗi cho tôi "Mã thông báo không mong đợi ", đó là lý do tại sao tôi chuyển sang cuộc gọi được đề cập trong bài đăng gốc của mình.
TheBlueSky

Tôi đánh dấu đây là câu trả lời vì liên kết stackoverflow.com/a/9920700/446681
TheBlueSky

40
express.bodyParser()không được dùng trong Express 4.x. Thay vào đó, hãy sử dụng npmjs.org/package/body-parser .
Luc

@TheBlueSky lý do tại sao bạn nhận được "Mã thông báo bất ngờ" là vì trình bao tiêu tốn dấu ngoặc kép của bạn. Điều tương tự xảy ra nếu bạn làm echo any"thing". Dữ liệu bạn đang đăng phải nằm trong dấu ngoặc kép để ngăn điều này xảy ra.
Tom Fenech

11
Từ express 4.16.0 trở lên, có thể sử dụng express.json () trong app.use () theo cách này => app.use (express.json ());
Mitro 27/03/18

187

Bắt đầu từ express v4.16 , không cần phải yêu cầu bất kỳ mô-đun bổ sung nào, chỉ cần sử dụng phần mềm trung gian JSON tích hợp :

app.use(express.json())

Như thế này:

const express = require('express')

app.use(express.json())    // <==== parse request body as JSON

app.listen(8080)

app.post('/test', (req, res) => {
  res.json({requestBody: req.body})  // <==== req.body will be a parsed JSON object
})

Lưu ý - body-parser, tùy thuộc vào điều này, đã được bao gồm trong express.

Cũng đừng quên gửi tiêu đề Content-Type: application/json


14
Cảm ơn bạn, đây là câu trả lời tốt nhất cho 4.16+ rồi. Không phụ thuộc khác và làm việc như một nét duyên dáng!
codepleb

1
Giải pháp tốt nhất / duy nhất tôi có thể tìm thấy không cần trình phân tích cú pháp cơ thể
Mote Zart

41

Kể từ Express 4, đoạn mã sau xuất hiện để thực hiện thủ thuật. Lưu ý rằng bạn sẽ cần phải cài đặt body-parserbằng cách sử dụng npm.

var express = require('express');
var bodyParser = require('body-parser');
var app = express();
app.use(bodyParser.urlencoded({ extended: false }));


app.listen(8888);

app.post('/update', function(req, res) {
    console.log(req.body); // the posted data
});

29
Để phân tích cú pháp json, cần phải thêm dòng sauapp.use(bodyParser.json())
Camilo Silva

1
@ cml.co là có bất cứ lý do app.use(bodyParser.urlencoded({ extended: true })còn cần thiết? Tôi đang đăng một tài liệu khá phức tạp như JSON trong yêu cầu và extended: falsekhông hoạt động. Chỉ khi tôi đặt nó thành đúng, yêu cầu được phân tích cú pháp chính xác.
Người dùng web

3
Chỉ cần một lưu ý. Phải sử dụng app.use(bodyParser.urlencoded({ extended: true }));AND app.use(bodyParser.json())để nhận dữ liệu json trên thiết lập máy chủ AWS Linux với NodeJS và Express.
David

24
var express = require('express');
var bodyParser = require('body-parser');
var app = express();
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json())

var port = 9000;

app.post('/post/data', function(req, res) {
    console.log('receiving data...');
    console.log('body is ',req.body);
    res.send(req.body);
});

// start the server
app.listen(port);
console.log('Server started! At http://localhost:' + port);

Điều này sẽ giúp bạn. Tôi giả sử bạn đang gửi cơ thể trong json.


Tôi luôn quên thêm bodyParser.json () bit x_x cảm ơn!
Jonny Asmar

14

Đối với năm 2019, bạn không cần phải cài đặt body-parser.

Bạn có thể dùng:

var express = require('express');
var app = express();
app.use(express.json())
app.use(express.urlencoded({extended: true}))
app.listen(8888);
app.post('/update', function(req, res) {
    console.log(req.body); // the posted data
});

8

Điều này có thể đạt được mà không cần body-parserphụ thuộc là tốt, nghe request:datarequest:endvà trả lại phản ứng trên cuối yêu cầu, tham khảo dưới đây mẫu mã. ref: https://nodejs.org/en/docs/guides/anatomy-of-an-http-transaction/#request-body

var express = require('express');
var app = express.createServer(express.logger());

app.post('/', function(request, response) {

    // push the data to body
    var body = [];
    request.on('data', (chunk) => {
      body.push(chunk);
    }).on('end', () => {
      // on end of data, perform necessary action
      body = Buffer.concat(body).toString();
      response.write(request.body.user);
      response.end();
    });
});

3

Thử cái này:

response.write(JSON.stringify(request.body));

Điều đó sẽ lấy đối tượng bodyParserđã tạo cho bạn và biến nó trở lại thành một chuỗi và viết nó vào phản hồi. Nếu bạn muốn phần thân yêu cầu chính xác (có cùng khoảng trắng, v.v.), bạn sẽ cần dataendngười nghe đính kèm với yêu cầu trước đó và xây dựng đoạn chuỗi bằng chunk như bạn có thể thấy trong mã nguồn phân tích json từ kết nối .


1

Những gì bạn tuyên bố đã "thử làm" chính xác là những gì bạn đã viết trong mã hoạt động "như mong đợi" khi bạn gọi nó với curl.

Lỗi bạn nhận được dường như không liên quan đến bất kỳ mã nào bạn đã chỉ cho chúng tôi.

Nếu bạn muốn nhận được yêu cầu thô, hãy đặt trình xử lý requestcho dataendcác sự kiện (và, tất nhiên, loại bỏ bất kỳ yêu cầu nào express.bodyParser()). Lưu ý rằng các datasự kiện sẽ xảy ra theo từng khối và trừ khi bạn đặt mã hóa cho datasự kiện, các khối đó sẽ là bộ đệm chứ không phải chuỗi.


đó là một lỗi sao chép-dán; Tôi có nghĩa là request.bodyvà không request.body.user, và tôi đã sửa nó ngay bây giờ. Nhân tiện, var reqBody = request.body;vẫn và vẫn đúng và khi bạn thử, bạn sẽ gặp lỗi. Dù sao, bạn có thể vui lòng cho một ví dụ về việc thiết lập trình xử lý không request; Tôi dường như không tìm thấy nó trong hướng dẫn nhanh.
TheBlueSky

1

Nếu bạn đủ lười biếng để đọc các đoạn dữ liệu bài viết. bạn chỉ có thể dán dòng dưới đây để đọc json.

Dưới đây là cho TypeScript tương tự cũng có thể được thực hiện cho JS.

ứng dụng

 import bodyParser from "body-parser";
 // support application/json type post data
 this.app.use(bodyParser.json());
 // support application/x-www-form-urlencoded post data
 this.app.use(bodyParser.urlencoded({ extended: false }));

Trong một trong những bộ điều khiển của bạn nhận được sử dụng cuộc gọi POST như dưới đây

userControll.ts

 public async POSTUser(_req: Request, _res: Response) {
   try {
          const onRecord = <UserModel>_req.body;
           /* Your business logic */
           _res.status(201).send("User Created");
        }
    else{
           _res.status(500).send("Server error");
           }        
   };

_req.body nên phân tích dữ liệu json của bạn vào Mô hình TS.


1
Tôi không chắc chắn nếu bạn đang cố gắng khuyến khích hoặc không khuyến khích mọi người sử dụng câu trả lời của bạn bằng cách gọi họ là lười biếng :)
TheBlueSky

1

Tôi hoàn toàn mới đối với JS và ES, nhưng những gì dường như hoạt động với tôi chỉ là thế này:

JSON.stringify(req.body)

Hãy cho tôi biết nếu có bất cứ điều gì sai với nó!


chính xác những gì tôi cần
Josef Henn

0

Cài đặt Body Parser bằng lệnh bên dưới

$ npm install --save body-parser

Cấu hình phân tích cú pháp cơ thể

const bodyParser = require('body-parser');
app.use(bodyParser);
app.use(bodyParser.json()); //Make sure u have added this line
app.use(bodyParser.urlencoded({ extended: false }));

-3

Bạn sử dụng mã sau đây để đăng nhập dữ liệu bài viết:

router.post("/users",function(req,res){
    res.send(JSON.stringify(req.body, null, 4));
});

2
Trả lời đưa ra là không đầy đủ mà không bao gồm mô-đun phân tích cơ thể.
gramcha
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.