Bagaimana cara mengonsumsi data JSON POST dalam aplikasi Express


307

Saya mengirim string JSON berikut ke server saya.

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

Di server saya punya ini.

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

Ketika saya mengirim string, itu menunjukkan bahwa saya mendapat respons 200, tetapi dua metode lainnya tidak pernah berjalan. Mengapa demikian?

Jawaban:


479

Saya pikir Anda menggabungkan penggunaan responseobjek dengan objek request.

The responseobjek adalah untuk mengirimkan kembali respon HTTP ke klien menelepon, sedangkan Anda ingin mengakses tubuh request. Lihat jawaban ini yang menyediakan beberapa panduan.

Jika Anda menggunakan JSON yang valid dan POSTING dengannya Content-Type: application/json, maka Anda dapat menggunakan bodyParsermiddleware untuk mem-parsing badan permintaan dan menempatkan hasilnya di request.bodyrute Anda.

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

Uji sepanjang garis:

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

Diperbarui untuk Express 4+

Body parser dipecah menjadi paket npm sendiri setelah v4, membutuhkan instalasi terpisah 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);

Pembaruan untuk Express 4.16+

Dimulai dengan rilis 4.16.0, express.json()middleware baru tersedia.

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
Karena rangkuman memohon toString()pada objek. Lihatlah node docs untuk console.log, karena memeriksa objek dan mengembalikan representasi string.
Pero P.

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

3
Arus console.log()akan secara otomatis merangkai objek (melalui util.inspect()), jadi ini akan berhasil:console.log("with request", request.body);
Tommy Stanton

4
Jawaban ini sudah usang, tetapi jawaban dari @ chrisarton sudah terbaru.
Emil Ingerslev

209

Untuk Express v4 +

instal body-parser dari 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
mengapa mereka terus mengeluarkan barang yang digunakan semua orang?
light24bulbs

11
@ light24bulbs Jadi (Ekspres) akan lebih ramping dan berarti bagi mereka yang tidak menggunakan / membutuhkannya.
andyengle

6
@andyengle Itu masuk akal. Tapi saya pikir hampir semua orang menggunakan parsing permintaan. Itu sepertinya fitur inti bagi saya.
light24bulbs

23
Karena antarmuka fungsi middleware adalah standar yang digunakan oleh banyak perpustakaan, itu juga memungkinkan aplikasi yang tidak menggunakan Express untuk menggunakan fungsi middleware ini.
Anm

3
Mengambilnya dari ekspres tidak memungkinkannya untuk digunakan oleh aplikasi yang tidak menggunakan permintaan. Mereka bisa membuatnya terpisah, dan memasukkannya dalam express secara default.
JJ

18

Terkadang Anda tidak perlu pustaka pihak ketiga untuk mem-parse JSON dari teks. Terkadang yang Anda butuhkan adalah perintah JS berikut, coba dulu:

        const res_data = JSON.parse(body);

3
Pertanyaan aslinya adalah tentang parsing JSON dari pesan POST dalam kerangka kerja Express. Tanpa middleware BodyParser, data JSON tidak akan ada di properti tubuh objek permintaan.
ThisClark

1
Saya menemukan ini berguna, ketika mem-parsing respons server. Terima kasih!
Hasan Alsawadi

1
Terima kasih Hasan, saya menghargai komentar Anda. Itu membantu saya ketika saya mencari solusi dan menemukan posting ini. Tidak yakin apakah itu berfungsi dalam semua kasus tetapi pasti berfungsi di beberapa kasus dan ini merupakan solusi yang lebih baik daripada menggunakan perpustakaan pihak ketiga.
xims

1
Jawaban dan komentar Anda memberikan jawaban dengan lebih banyak informasi (semakin banyak informasi menjadi jawaban Anda di sini). Anda harus memperbarui jawaban Anda untuk menunjukkan bahwa express membutuhkan body-parser atau memberikan alternatif untuk menunjukkan bagaimana body-parser mendapatkan data di tempat pertama.
dewwwald

2
tidak mendefinisikanbody
jameshfisher

15

Bagi yang mendapatkan objek kosong req.body

Saya lupa mengatur headers: {"Content-Type": "application/json"} permintaan. Mengubahnya memecahkan masalah.


Tidak percaya saya melewatkan ini! Saya mengirim text/jsondan menerima {}sebagai tanggapan. Pengawasan total pada bagian saya. Sangat membantu.
James M. Lay

Ugh - Aku juga merindukan ini. Terima kasih telah memposting ini jadi saya tidak membuang waktu lebih banyak dari yang sudah saya miliki
Steve Gomez

9

@Daniel Thompson menyebutkan bahwa dia lupa menambahkan {"Tipe-Konten": "application / json"} dalam permintaan . Ia dapat mengubah permintaan, namun, mengubah permintaan tidak selalu mungkin (kami sedang mengerjakan server di sini).

Dalam kasus saya, saya perlu memaksa tipe konten: teks / polos untuk diuraikan sebagai json.

Jika Anda tidak dapat mengubah jenis konten permintaan, coba gunakan kode berikut:

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

Alih-alih menggunakan express.json () secara global, saya lebih suka menerapkannya hanya jika diperlukan, misalnya dalam permintaan 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());

App.use ini (express.json) sekarang akan membiarkan Anda membaca objek JSON posting masuk

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.