Làm cách nào để sử dụng dữ liệu JSON POST trong ứng dụng Express


307

Tôi đang gửi chuỗi JSON sau đến máy chủ của mình.

(
        {
        id = 1;
        name = foo;
    },
        {
        id = 2;
        name = bar;
    }
)

Trên máy chủ tôi có cái này.

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

    console.log("Got response: " + response.statusCode);

    response.on('data', function(chunk) {
        queryResponse+=chunk;
        console.log('data');
    });

    response.on('end', function(){
        console.log('end');
    });
});

Khi tôi gửi chuỗi, nó cho thấy tôi nhận được 200 phản hồi, nhưng hai phương thức kia không bao giờ chạy. Tại sao vậy?

Câu trả lời:


479

Tôi nghĩ rằng bạn đang kết hợp việc sử dụng responseđối tượng với mục đích đó request.

Đối responsetượng là để gửi phản hồi HTTP trở lại máy khách đang gọi, trong khi bạn muốn truy cập vào phần thân của request. Xem câu trả lời này cung cấp một số hướng dẫn.

Nếu bạn đang sử dụng JSON hợp lệ và đang POST nó với Content-Type: application/json, thì bạn có thể sử dụng bodyParserphần mềm trung gian để phân tích phần thân yêu cầu và đặt kết quả vào request.bodytuyến đường của bạn.

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

app.use(express.bodyParser());

app.post('/', function(request, response){
  console.log(request.body);      // your JSON
  response.send(request.body);    // echo the result back
});

app.listen(3000);

Kiểm tra dọc theo dòng:

$ curl -d '{"MyKey":"My Value"}' -H "Content-Type: application/json" http://127.0.0.1:3000/
{"MyKey":"My Value"}

Đã cập nhật cho Express 4+

Trình phân tích cú pháp cơ thể được tách ra thành gói npm của riêng nó sau v4, yêu cầu cài đặt riêng npm install body-parser

var express = require('express')
  , bodyParser = require('body-parser');

var app = express();

app.use(bodyParser.json());

app.post('/', function(request, response){
  console.log(request.body);      // your JSON
   response.send(request.body);    // echo the result back
});

app.listen(3000);

Cập nhật cho Express 4.16+

Bắt đầu với phiên bản 4.16.0, một express.json()phần mềm trung gian mới đã có sẵn.

var express = require('express');

var app = express();

app.use(express.json());

app.post('/', function(request, response){
  console.log(request.body);      // your JSON
   response.send(request.body);    // echo the result back
});

app.listen(3000);

21
request.body.MyKey
Pero P.

5
Bởi vì sự kết hợp gọi toString()vào đối tượng. Hãy xem các tài liệu nút cho console.log, vì nó kiểm tra đối tượng và trả về một chuỗi đại diện.
Pero P.

13
console.log('request =' + JSON.stringify(request.body))
Pero P.

3
Dòng điện console.log()sẽ tự động xâu chuỗi một đối tượng (thông qua util.inspect()), vì vậy điều này sẽ hoạt động:console.log("with request", request.body);
Tommy Stanton

4
Câu trả lời này đã lỗi thời, nhưng câu trả lời từ @chrisarton đã được cập nhật.
Emil Ingerslev

209

Đối với Express v4 +

cài đặt trình phân tích cú pháp cơ thể từ npm.

$ npm install body-parser

https://www.npmjs.org/package/body-parser#installation

var express    = require('express')
var bodyParser = require('body-parser')

var app = express()

// parse application/json
app.use(bodyParser.json())

app.use(function (req, res, next) {
  console.log(req.body) // populated!
  next()
})

23
Tại sao họ cứ lấy ra mọi thứ mọi người sử dụng?
light24bulbs

11
@ light24bulbs Vì vậy, nó (Express) sẽ gọn gàng hơn và có nghĩa là cho những người không sử dụng / cần điều đó.
andyengle

6
@andyengle Điều đó thật có ý nghĩa. Nhưng tôi nghĩ rằng hầu như tất cả mọi người sử dụng phân tích yêu cầu. Đó dường như là một tính năng cốt lõi đối với tôi.
light24bulbs

23
Vì giao diện chức năng phần mềm trung gian là một tiêu chuẩn được sử dụng bởi nhiều thư viện, nó cũng cho phép các ứng dụng không sử dụng Express để sử dụng các chức năng phần mềm trung gian này.
Anm

3
Việc đưa nó ra khỏi express không cho phép nó được sử dụng bởi các ứng dụng không sử dụng yêu cầu. Họ có thể đã làm cho nó tách biệt và bao gồm nó theo mặc định.
JJ

18

Đôi khi bạn không cần thư viện của bên thứ ba để phân tích JSON từ văn bản. Đôi khi tất cả những gì bạn cần là lệnh JS sau đây, hãy thử trước:

        const res_data = JSON.parse(body);

3
Câu hỏi ban đầu là về phân tích cú pháp JSON từ một thông điệp POST trong khung Express. Không có phần mềm trung gian BodyParser, dữ liệu JSON sẽ không tồn tại trong thuộc tính cơ thể của đối tượng yêu cầu.
ThisClark 7/11/2016

1
Tôi thấy điều này hữu ích, khi phân tích phản hồi của máy chủ. Cảm ơn!
Hasan Alsawadi

1
Cảm ơn Hasan, tôi đánh giá cao nhận xét của bạn. Nó đã giúp tôi khi tôi đang tìm giải pháp và tình cờ thấy bài này. Không chắc chắn nếu nó hoạt động trong mọi trường hợp nhưng nó chắc chắn hoạt động trong một số và nó là một giải pháp tốt hơn so với sử dụng thư viện của bên thứ ba.
xims

1
Câu trả lời của bạn và một bình luận cung cấp câu trả lời với nhiều thông tin hơn (càng nhiều thông tin là câu trả lời của bạn ở đây). Bạn nên cập nhật câu trả lời của mình để chỉ ra rằng express cần trình phân tích cú pháp cơ thể hoặc đưa ra giải pháp thay thế để chỉ ra cách trình phân tích cú pháp cơ thể có được dữ liệu ở vị trí đầu tiên.
dewwwald

2
không định nghĩabody
jameshfisher

15

Đối với những người nhận được một đối tượng trống trong req.body

Tôi đã quên để thiết lập headers: {"Content-Type": "application/json"} trong yêu cầu. Thay đổi nó đã giải quyết vấn đề.


Không thể tin rằng tôi đã bỏ lỡ điều này! Tôi đã gửi text/jsonvà nhận được {}như là một phản ứng. Tổng giám sát về phía tôi. Rất hữu ích.
James M. Lay

Ugh - tôi cũng nhớ cái này Cảm ơn bạn đã đăng bài này để tôi không lãng phí nhiều thời gian hơn tôi đã có!
Steve Gomez

9

@Daniel Thompson đề cập rằng anh ta đã quên thêm {"Kiểu nội dung": "application / json"} trong yêu cầu . Anh ta đã có thể thay đổi yêu cầu, tuy nhiên, việc thay đổi yêu cầu không phải lúc nào cũng có thể (chúng tôi đang làm việc trên máy chủ ở đây).

Trong trường hợp của tôi, tôi cần buộc loại nội dung: text / plain được phân tích thành json.

Nếu bạn không thể thay đổi loại nội dung của yêu cầu, hãy thử sử dụng mã sau đây:

app.use(express.json({type: '*/*'}));

Thay vì sử dụng express.json () trên toàn cầu, tôi chỉ thích áp dụng nó khi cần thiết, ví dụ như trong yêu cầu POST:

app.post('/mypost', express.json({type: '*/*'}), (req, res) => {
  // echo json
  res.json(req.body);
});

7

const express = require('express');
let app = express();
app.use(express.json());

Ứng dụng này.use (express.json) bây giờ sẽ cho phép bạn đọc đối tượng JSON của bài đăng đến

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.