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?

ahli saraf
sumber

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);
Pero P.
sumber
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()
})
chrisarton
sumber
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);
xims
sumber
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.

Daniel Thompson
sumber
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);
});
anneb
sumber
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

SuRa
sumber