Express uygulamasında JSON POST verilerini nasıl tüketirim


307

Sunucuma aşağıdaki JSON dizesini gönderiyorum.

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

Sunucuda bu var.

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

Dizeyi gönderdiğimde, 200 yanıt aldığımı gösterir, ancak diğer iki yöntem asla çalışmaz. Neden?

Yanıtlar:


479

Bence responsenesnenin kullanımını onunla karıştırıyorsunuz request.

responseEğer gövdesini erişmek isteyen oysa nesne, çağıran müşteriye HTTP yanıt geri göndermek içindir request. Bazı rehberlik sağlayan bu cevaba bakınız .

Geçerli bir JSON kullanıyorsanız ve ile POSTing Content-Type: application/jsonyapıyorsanız bodyParser, istek gövdesini ayrıştırmak ve sonucu request.bodyrotanıza yerleştirmek için ara katman yazılımını kullanabilirsiniz .

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

Aşağıdakiler boyunca test edin:

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

Express 4+ için güncellendi

V4'ten sonra gövde ayrıştırıcı kendi npm paketine bölündü, ayrı bir kurulum gerektiriyor 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);

Express 4.16+ için güncelleme

4.16.0 sürümünden başlayarak yeni bir express.json()ara katman yazılımı kullanıma sunuldu.

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.4

5
Çünkü birleştirme toString()nesneyi çağırır . console.logNesneyi inceleyen ve bir dize temsili döndürdüğü için , düğüm belgelerine bir göz atın .
Pero P.4

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

3
Akım console.log()otomatik olarak bir nesneyi (üzerinden util.inspect()) dize edecektir , bu yüzden bu işe yarar :console.log("with request", request.body);
Tommy Stanton

4
Bu cevap eski, ancak @chrisarton'dan gelen cevap güncel.
Emil Ingerslev

209

Express v4 + için

vücut ayrıştırıcısını npm'den yükleyin.

$ 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
neden herkesin kullandığı eşyaları çıkarmaya devam ediyorlar?
light24bulbs

11
@ light24bulbs Yani (Ekspres) kullanmayan / ihtiyacı olmayanlar için daha yalın ve ortalama olacaktır.
andyengle

6
@andyengle Bu mantıklı. Ama bence neredeyse herkes istek ayrıştırma kullanıyor. Bu benim için temel bir özellik gibi görünüyor.
light24bulbs

23
Ara katman işlevi arabirimi birçok kitaplık tarafından kullanılan bir standart olduğundan, Express kullanmayan uygulamaların bu ara katman işlevleri kullanmasına izin verir.
Anm

3
Açık bir şekilde çıkarılması, istek kullanmayan uygulamalar tarafından kullanılmasına izin vermez. Ayrı bir hale getirebilirler ve varsayılan olarak eksprese dahil edebilirlerdi.
JJ

18

Bazen JSON'u metinden ayrıştırmak için üçüncü taraf kitaplıklarına ihtiyacınız yoktur. Bazen tek ihtiyacınız olan aşağıdaki JS komutu, önce deneyin:

        const res_data = JSON.parse(body);

3
Asıl soru, Express çerçevesindeki bir POST mesajından JSON'un ayrıştırılmasıyla ilgilidir. BodyParser ara katman yazılımı olmadan, JSON verileri istek nesnesinin body özelliğinde bulunmaz.
ThisClark

1
Sunucu yanıtı ayrıştırılırken bu yararlı buldum. Teşekkürler!
Hasan Alsawadi

1
Teşekkürler Hasan, Yorumunuz için teşekkür ederim. Çözüm ararken bana yardımcı oldu ve bu gönderiyle karşılaştım. Her durumda işe yarayıp yaramadığından emin değilim ama kesinlikle bazılarında çalışıyor ve üçüncü taraf kitaplığını kullanmaktan daha iyi bir çözüm.
xims

1
Cevabınız ve yorumunuz daha fazla bilgi sağlar (burada daha fazla bilgi cevabınızdır). Cevabınızın gövde ayrıştırıcısına ihtiyaç duyduğunu belirtmek için cevabınızı güncellemeli veya gövde ayrıştırıcısının ilk etapta verileri nasıl aldığını belirten bir alternatif sunmalısınız.
dewwwald

2
tanımlamıyorbody
jameshfisher

15

Boş bir nesne alanlara req.body

headers: {"Content-Type": "application/json"} İstekte bulunmayı unutmuştum . Bunu değiştirmek sorunu çözdü.


Bunu özlediğime inanamıyorum! İle gönderiyordum text/jsonve {}yanıt alıyordum . Benim açımdan toplam gözetim. Çok yararlı.
James

Ugh - Bunu da özledim. Bunu yayınladığınız için teşekkür ederim, bu yüzden zaten sahip olduğumdan daha fazla zaman kaybetmiyorum!
Steve Gomez

9

İçinde: @Daniel Thompson o { "application / json" "Content-Type"} eklemek unutmuştu bahseder istek . İsteği değiştirebildi, ancak istekleri değiştirmek her zaman mümkün değil (burada sunucu üzerinde çalışıyoruz).

Benim durumumda json olarak ayrıştırılmak için content-type: text / plain'ı zorlamam gerekiyordu.

İsteğin içerik türünü değiştiremiyorsanız, aşağıdaki kodu kullanmayı deneyin:

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

Express.json () öğesini global olarak kullanmak yerine, yalnızca gerektiğinde, örneğin bir POST isteğinde kullanmayı tercih ederim:

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

Bu app.use (express.json) şimdi gelen JSON nesnesini okumanıza izin verecek

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.