एक्सप्रेस एप्लिकेशन में मैं JSON POST डेटा का उपभोग कैसे करूं


307

मैं अपने सर्वर पर निम्नलिखित JSON स्ट्रिंग भेज रहा हूं।

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

सर्वर पर मेरे पास यह है।

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

जब मैं स्ट्रिंग भेजता हूं, तो यह दिखाता है कि मुझे 200 प्रतिक्रिया मिली, लेकिन वे अन्य दो तरीके कभी नहीं चलते हैं। ऐसा क्यों है?

जवाबों:


479

मुझे लगता है कि आप responseउस के साथ वस्तु का उपयोग कर रहे हैं request

responseजबकि आप के शरीर का उपयोग करने के लिए इच्छुक रहे हैं वस्तु, बुला ग्राहक के लिए HTTP प्रतिसाद वापस भेजने के लिए है request। इस उत्तर को देखें जो कुछ मार्गदर्शन प्रदान करता है।

यदि आप वैध JSON का उपयोग कर रहे हैं और इसके साथ पोस्ट कर रहे हैं Content-Type: application/json , तो आप bodyParserअनुरोध बॉडी को पार्स करने के लिए मिडलवेयर का उपयोग कर सकते हैं और परिणाम request.bodyको अपने रूट पर रख सकते हैं।

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

की तर्ज पर टेस्ट करें:

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

एक्सप्रेस 4+ के लिए अपडेट किया गया

बॉडी पार्सर को v4 के बाद स्वयं के npm पैकेज में विभाजित किया गया था, इसके लिए एक अलग इंस्टॉल की आवश्यकता होती है 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);

एक्सप्रेस 4.16+ के लिए अपडेट करें

4.16.0 रिलीज के साथ शुरू, एक नया express.json()मिडलवेयर उपलब्ध है।

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
पेरो पी।

5
क्योंकि संकल्‍प toString()वस्तु पर आक्रमण करता है । इसके लिए नोड डॉक्स पर एक नज़र डालें console.log, क्योंकि यह ऑब्जेक्ट का निरीक्षण करता है और एक स्ट्रिंग प्रतिनिधित्व देता है।
पेरो पी।

13
console.log('request =' + JSON.stringify(request.body))
पेरो पी।

3
करंट console.log()स्वचालित रूप से किसी ऑब्जेक्ट (थ्रू util.inspect()) को स्ट्रिंग करेगा , इसलिए यह काम करेगा:console.log("with request", request.body);
टॉमी स्टैंटन

4
यह उत्तर पुराना है, लेकिन @chrisarton से एक अप टू डेट है।
एमिल इंगर्सलेव

209

एक्सप्रेस v4 + के लिए

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
क्यों वे हर किसी का उपयोग कर सामान निकालते रहते हैं?
light24bulbs

11
@ light24bulbs तो यह (एक्सप्रेस) उन लोगों के लिए अधिक दुबला और औसत होगा, जो इसका उपयोग नहीं करते / करते हैं।
अयंगले

6
@andyengle जो समझ में आता है। लेकिन मुझे लगता है कि वस्तुतः हर कोई अनुरोध पार्सिंग का उपयोग करता है। यह मुझे एक मुख्य विशेषता की तरह लगता है।
light24bulbs

23
चूंकि मिडलवेयर फ़ंक्शन इंटरफ़ेस कई पुस्तकालयों द्वारा उपयोग किया जाने वाला एक मानक है, इसलिए यह उन ऐप्स को भी अनुमति देता है जो इन मिडलवेयर फ़ंक्शन का उपयोग करने के लिए एक्सप्रेस का उपयोग नहीं करते हैं।
अनम

3
इसे एक्सप्रेस से बाहर ले जाने से यह उन एप्लिकेशन द्वारा उपयोग करने की अनुमति नहीं देता है जो अनुरोधों का उपयोग नहीं करते हैं। वे इसे अलग बना सकते थे, और इसे डिफ़ॉल्ट रूप से व्यक्त में शामिल कर सकते थे।
जेजे

18

कभी-कभी आपको JSON को पाठ से पार्स करने के लिए तीसरे पक्ष के पुस्तकालयों की आवश्यकता नहीं होती है। कभी-कभी आपको निम्नलिखित जेएस कमांड की आवश्यकता होती है, इसे पहले आज़माएं:

        const res_data = JSON.parse(body);

3
मूल प्रश्न एक्सप्रेस ढांचे में एक पोस्ट संदेश से JSON को पार्स करने के बारे में है। BodyParser मिडलवेयर के बिना, JSON डेटा अनुरोध ऑब्जेक्ट की बॉडी प्रॉपर्टी में मौजूद नहीं होगा।
ThisClark

1
सर्वर प्रतिक्रिया के पार्स करते समय मुझे यह उपयोगी लगा। धन्यवाद!
बजे हसन अलसावादी

1
धन्यवाद हसन, मैं आपकी टिप्पणी की सराहना करता हूं। इसने मेरी मदद की जब मैं समाधान खोज रहा था और इस पद पर आया था। सुनिश्चित नहीं है कि यह सभी मामलों में काम करता है, लेकिन यह निश्चित रूप से कुछ में काम करता है और तीसरे पक्ष के पुस्तकालय का उपयोग करने से बेहतर समाधान है।
०१

1
आपका उत्तर और एक टिप्पणी अधिक जानकारी के साथ उत्तर प्रदान करती है (अधिक जानकारी आपका उत्तर यहां दिया जा रहा है)। आपको यह इंगित करने के लिए अपने उत्तर को अपडेट करना चाहिए कि एक्सप्रेस को बॉडी-पार्सर की आवश्यकता है या यह इंगित करने के लिए एक विकल्प दें कि बॉडी-पार्सर को पहले स्थान पर डेटा कैसे मिला।
देवलवल्ड

2
परिभाषित नहीं करता हैbody
jameshfisher

15

में एक खाली वस्तु प्राप्त करने वालों के लिए req.body

मैं headers: {"Content-Type": "application/json"} अनुरोध में सेट करना भूल गया था । इसे बदलने से समस्या हल हो गई।


विश्वास नहीं कर सकता मैं यह याद किया! मैं के साथ भेज रहा था text/jsonऔर हो रही {}एक प्रतिक्रिया के रूप। मेरी ओर से कुल निरीक्षण। बहुत मददगार।
जेम्स एम। ले

ऊ - मैंने यह भी याद किया। इसे पोस्ट करने के लिए धन्यवाद, इसलिए मेरे पास पहले से अधिक समय बर्बाद नहीं है!
स्टीव गोमेज़

9

@ डैनियल थॉम्पसन का उल्लेख है कि वह {"सामग्री-प्रकार": "एप्लिकेशन / json"} को जोड़ना भूल गया था अनुरोध । वह अनुरोध को बदलने में सक्षम था, हालांकि, अनुरोधों को बदलना हमेशा संभव नहीं होता है (हम यहां सर्वर पर काम कर रहे हैं)।

मेरे मामले में मुझे सामग्री-प्रकार को बाध्य करने की आवश्यकता थी: पाठ / सादे को जस के रूप में पार्स किया जाना चाहिए।

यदि आप अनुरोध के सामग्री-प्रकार को बदल नहीं सकते हैं, तो निम्न कोड का उपयोग करके देखें:

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

विश्व स्तर पर एक्सप्रेस.जॉसन () का उपयोग करने के बजाय, मैं इसे केवल वहीं लागू करना चाहता हूं, उदाहरण के लिए POST अनुरोध में:

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.