एक्सप्रेस के साथ बॉडी-पार्सर क्या करता है?


339

मुझे समझ नहीं आ रहा है कि हमें body-parserएक्सप्रेस एप्लिकेशन की आवश्यकता क्यों है , क्योंकि हम बिना उपयोग किए डेटा प्राप्त कर सकते हैं body-parser। और यह वास्तव में और कैसे करता है?


54
HTTP POST डेटा पढ़ने के लिए, हमें "बॉडी-पार्सर" नोड मॉड्यूल का उपयोग करना होगा। बॉडी-पार्सर एक्सप्रेस मिडलवेयर का एक टुकड़ा है जो एक फॉर्म के इनपुट को पढ़ता है और इसे जावास्क्रिप्ट ऑब्जेक्ट के माध्यम से स्टोर करता है जो कि सुलभ हैreq.body
रिफ्लेक्टर

2
एक्सप्रेस के साथ आप HTTP रिक्वेस्ट जैसे हेडर req.headers(एरे) के अंदर कोई भी डेटा पढ़ सकते हैं , आप req.body@CleanCrispCode द्वारा बताए गए http पैकेट के बॉडी को पढ़ सकते हैं और आप क्वेरी पैरामीटर के रूप में पढ़ सकते हैं req.query.variable, यह एक्सप्रेस में रिक्वेस्ट को स्वचालित रूप से जावास्क्रिप्ट में बदलने में मदद करता है। ऑब्जेक्ट्स
फर्नांडो ज़म्परिन

3
@refactor - यह कई कारणों में से एक हो सकता है जो हमें बॉडी पार्सर का उपयोग करना है, लेकिन यह नहीं कहता कि यह क्या करता है, अर्थात HTTP अनुरोध और प्रतिक्रिया ऑब्जेक्ट स्ट्रीम हैं और वे एकल ऑब्जेक्ट के रूप में 'पठनीय' नहीं हैं। res.bodyपूरी धारा के बिना पहले की तरह बफ़र किया जा रहा है res.body
ortonomy

1
एक्सप्रेस संस्करण 4.16+ के साथ उन्होंने बॉडी-पार्सर के अपने स्वयं के संस्करण को शामिल किया है जिससे आपको इस पैकेज में खींचने की जरूरत नहीं है।
स्टीफनबॉब

जवाबों:


255

Express.js संस्करण 4 और इसके बाद के संस्करण HTTP POSTमें अनुरोध को संभालने के लिए , आपको मिडलवेयर मॉड्यूल को स्थापित करने की आवश्यकता है ।body-parser

body-parserएक आने वाले अनुरोध स्ट्रीम के पूरे शरीर के हिस्से को निकालने और उस पर उजागर करता है req.body

मिडलवेयर पहले Express.js का एक हिस्सा था, लेकिन अब आपको इसे अलग से इंस्टॉल करना होगा।

यह body-parserमॉड्यूल HTTP POSTअनुरोध का उपयोग करके सबमिट किए गए JSON, बफर, स्ट्रिंग और URL एन्कोडेड डेटा को पार्स करता है । body-parserएनपीएम का उपयोग कर स्थापित करें जैसा कि नीचे दिखाया गया है।

npm install body-parser --save

2019-april-2 में संपादित करें: express@4.16.0 में बॉडी-पार्सर मिडलवेयर एक्सप्रेस के साथ बंडल किया गया। अधिक जानकारी के लिए इसे देखें


126
यह संभवत: अब तक की सबसे लम्बी चीज है। एक्सप्रेस कोर देवों को नए लोगों के लिए वेब विकास में सबसे आम उपयोग के मामलों के लिए अतिरिक्त मिडलवेयर स्थापित करके बोर्ड पर प्राप्त करना अविश्वसनीय रूप से कठिन क्यों होगा?
इल्म

5
@ अगर आप राय के साथ कुछ चाहते हैं, तो sails.js आज़माएं
जॉर्ज

1
@ user1063287 हाँ यह करता है। urlencoded()और json()वास्तव में कर रहे मिडलवेयर कारखानों है कि एक मध्यस्थ समारोह लौटने जो आह्वानnext()
निक मैनिंग

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

28
@fnaquira - आप भ्रमित हैं। यह एक्सप्रेस नोड के बारे में नहीं है।
इल्म

85

हाँ हम बिना काम कर सकते हैं body-parser। जब आप उपयोग नहीं करते हैं कि आपको कच्चा अनुरोध मिलता है, और आपके शरीर और हेडर अनुरोध पैरामीटर के मूल ऑब्जेक्ट में नहीं हैं। आपको व्यक्तिगत रूप से सभी क्षेत्रों में हेरफेर करना होगा।

या आप उपयोग कर सकते हैं body-parser, क्योंकि एक्सप्रेस टीम इसे बनाए रख रही है।

बॉडी-पार्सर आपके लिए क्या कर सकता है: यह अनुरोध को सरल करता है।
इसका उपयोग कैसे करें: यहाँ उदाहरण है:

इंस्टॉल npm install body-parser --save

एक्सप्रेस में बॉडी-पार्सर का उपयोग कैसे करें:

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

// support parsing of application/json type post data
app.use(bodyParser.json());

//support parsing of application/x-www-form-urlencoded post data
app.use(bodyParser.urlencoded({ extended: true }));

संपर्क।

https://github.com/expressjs/body-parser

और फिर आप रूट अनुरोध ऑब्जेक्ट में शरीर और हेडर प्राप्त कर सकते हैं। उदाहरण

app.post("/posturl",function(req,res,next){
    console.log(req.body);
    res.send("response");
})

3
जानकारी के लिए धन्यवाद, क्या आप बॉडी पार्सर के बिना एक कोड उदाहरण पोस्ट कर सकते हैं?
इलियास करीम

55

इस सवाल का जवाब यहाँ की व्याख्या यह बहुत विस्तृत और शानदार ढंग से, इस सवाल का जवाब शामिल हैं:

संक्षेप में; बॉडी-पार्सर एक इनकमिंग रिक्वेस्ट स्ट्रीम के पूरे बॉडी पार्ट को एक्सट्रैक्ट करता है और इसे req.bodyकुछ आसान इंटरफेस के साथ एक्सपोज़ करता है । आपको इसे प्रति सेर की आवश्यकता नहीं है, क्योंकि आप यह सब स्वयं कर सकते हैं। हालांकि, यह सबसे अधिक संभावना है कि आप क्या चाहते हैं और आपको परेशानी से बचाएंगे।


गहराई में थोड़ा और जाने के लिए; बॉडी-पार्सर आपको एक मिडलवेयर देता है जो आने वाले रिक्वेस्ट डेटा को अनज़िप करने के लिए नोडज / ज़्लिब का उपयोग करता है यदि यह ज़िप्ड और स्ट्रीम-बॉटल / रॉ-बॉडी है तो "पार्सिंग" से पहले अनुरोध बॉडी की पूरी, कच्ची सामग्री का इंतजार करें (इसका मतलब है कि यदि आप अनुरोध निकाय का उपयोग नहीं करने वाले थे, आपने कुछ समय बर्बाद किया)।

कच्ची सामग्री होने के बाद, बॉडी-पार्सर इसे चार रणनीतियों में से एक का उपयोग करके पार्स करेगा, जो आपके द्वारा उपयोग किए जाने वाले विशिष्ट मिडलवेयर पर निर्भर करता है:

  • bodyParser.raw () : क्या वास्तव में शरीर को पार्स नहीं है, लेकिन सिर्फ एक में पहले से बफ़र सामग्री को उजागर करता है बफर पर req.body

  • bodyParser.text () : बफर को सादे पाठ के रूप में पढ़ता है और परिणामी स्ट्रिंग को req.body पर उजागर करता है।

  • bodyParser.urlencoded () : URL को एन्कोडेड डेटा के रूप में पाठ को पार्स करता है (जो ब्राउज़र POST पर सेट नियमित रूप से प्रपत्र डेटा भेजने के लिए करते हैं) और परिणामी वस्तु (कुंजियों और मूल्यों वाले) को उजागर करता है req.body। तुलना के लिए; PHP में यह सब स्वचालित रूप से किया जाता है और अंदर उजागर होता है $_POST

  • bodyParser.json () : पाठ को JSON के रूप में बताता है और परिणामी वस्तु को उजागर करता है req.body

req.bodyवांछनीय सामग्री को सेट करने के बाद ही यह स्टैक में अगले मिडलवेयर को कॉल करेगा, जो तब बिना सोचे समझे और इसे पार्स करने के बारे में सोचने के बिना अनुरोध डेटा तक पहुंच सकता है।

आप उनके प्रलेखन को पढ़ने के लिए बॉडी-पार्सर जीथब का उल्लेख कर सकते हैं , इसमें इसके काम करने के बारे में जानकारी है।


47

आइए इस कम से कम तकनीकी रखने की कोशिश करें।

मान लीजिए कि आप नोड-जेएस सर्वर को html फॉर्म डेटा भेज रहे हैं यानी आपने सर्वर से अनुरोध किया है। सर्वर फ़ाइल आपके अनुरोध को एक अनुरोध वस्तु के तहत प्राप्त करेगी। अब तर्क से, यदि आप अपने सर्वर फ़ाइल में इस अनुरोध ऑब्जेक्ट को सांत्वना देते हैं, तो आपको अपना फॉर्म डेटा कुछ इस तरह से देखना चाहिए, जो तब निकाला जा सकता है, लेकिन वाह! तुम वास्तव में नहीं हो!

तो, हमारा डेटा कहां है? अगर यह केवल मेरे अनुरोध में मौजूद नहीं है तो हम इसे कैसे निकालेंगे।

इसका सरल विवरण है http आपके बिट्स और टुकड़ों में आपके फ़ॉर्म डेटा को भेजता है जो कि उनके गंतव्य तक पहुंचने के रूप में इकट्ठे होने का इरादा रखते हैं। तो आप अपना डेटा कैसे निकालेंगे।

लेकिन, क्यों हर समय का यह दर्द मैन्युअल रूप से अपने डेटा को चंक्स के लिए पार्स करना और इसे इकट्ठा करना है। "बॉडी-पार्सर" नामक कुछ का उपयोग करें, जो आपके लिए ऐसा करेगा।

body-parser आपके अनुरोध को पार्स करता है और इसे एक ऐसे प्रारूप में परिवर्तित करता है जिससे आप आसानी से प्रासंगिक जानकारी निकाल सकते हैं जिसकी आपको आवश्यकता हो सकती है।

उदाहरण के लिए, मान लें कि आपके सामने एक साइन-अप फ़ॉर्म है। आप इसे भर रहे हैं, और सर्वर से अनुरोध कर रहे हैं कि वह विवरणों को बचाए।

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

var loginDetails = {    
    username : request.body.username,    
    password : request.body.password    
};

तो मूल रूप से, बॉडी-पार्सर ने आपके आने वाले अनुरोध को पार्स किया, आपके फॉर्म डेटा वाले चंकल्स को इकट्ठा किया, फिर इस बॉडी ऑब्जेक्ट को आपके लिए बनाया और इसे आपके फॉर्म डेटा से भर दिया।


10

यह HTTP अनुरोध निकाय को पार्स करता है। यह आमतौर पर तब आवश्यक होता है जब आपको केवल आपके द्वारा हिट किए गए URL से अधिक जानने की आवश्यकता होती है, विशेष रूप से POST या PUT PCHCH HTTP अनुरोध के संदर्भ में जहां आप चाहते हैं कि जानकारी शरीर में समाहित है।

मूल रूप से JSON, सादा पाठ या बस एक कच्ची बफ़र वस्तु को वापस लाने के लिए आपके लिए एक मिडलवेयर है जो आपके लिए आवश्यक है।


8

पोस्ट डेटा का उपयोग करने के लिए हमें उपयोग करना होगा body-parser। मूल रूप से वह क्या body-parserहै जो शरीर को व्यक्त करने की अनुमति देता है और फिर उस Jsonवस्तु को पार्स करता है जिसे हम समझ सकते हैं।


7

ये सब सुविधा की बात है।

मूल रूप से, यदि प्रश्न 'क्या हमें उपयोग करने की आवश्यकता है body-parser?' जवाब न है'। हम क्लाइंट-पोस्ट-रिक्वेस्ट से अधिक सर्किट वाले मार्ग का उपयोग करके समान जानकारी के साथ आ सकते हैं जो आम तौर पर कम लचीला होगा और समान जानकारी प्राप्त करने के लिए हमें कोड की मात्रा बढ़ानी होगी।

यह उसी तरह है जैसे पूछना 'क्या हमें शुरू करने के लिए उपयोग करने की आवश्यकता है express?' फिर से, इसका उत्तर नहीं है, और फिर, वास्तव में यह सब हमें उन बुनियादी चीजों को करने के लिए और अधिक कोड लिखने की परेशानी से बचाने के लिए आता है, जो कि 'अंतर्निहित' के साथ आती हैं।

सतह पर - body-parserविभिन्न प्रकार के स्वरूपों में क्लाइंट अनुरोधों में निहित जानकारी को प्राप्त करना आसान बनाता है, बजाय इसके कि आप कच्चे डेटा स्ट्रीम को कैप्चर करें और पता लगाएँ कि सूचना किस प्रारूप में है, बहुत कम मैन्युअल रूप से उस जानकारी को उपयोग करने योग्य डेटा में पार्स कर रहा है।


6

रिक्वेस्ट बॉडी

POST या PUT अनुरोध प्राप्त करते समय, अनुरोध निकाय आपके आवेदन के लिए महत्वपूर्ण हो सकता है। शरीर के डेटा को प्राप्त करना अनुरोध हेडर तक पहुँचने की तुलना में थोड़ा अधिक शामिल है। अनुरोध वस्तु जो किसी हैंडलर को दी जाती है वह ReadableStream इंटरफ़ेस को लागू करती है। इस धारा को किसी अन्य धारा की तरह ही कहीं भी सुना या लगाया जा सकता है। हम स्ट्रीम के 'डेटा' और 'एंड' इवेंट्स को सुनकर डेटा को स्ट्रीम से सही तरीके से बाहर निकाल सकते हैं।

प्रत्येक 'डेटा' घटना में उत्सर्जित बंक एक बफ़र है। यदि आप जानते हैं कि यह स्ट्रिंग डेटा होने जा रहा है, तो सबसे अच्छी बात यह है कि डेटा को किसी ऐरे में इकट्ठा किया जाए, फिर 'एंड' में, इसे संक्षिप्त और स्ट्रिंग करें।

let body = [];
request.on('data', (chunk) => {
  body.push(chunk);
}).on('end', () => {
  body = Buffer.concat(body).toString();
  // at this point, `body` has the entire request body stored in it as a string
});

बॉडी-पार्सर को समझना

इसके प्रलेखन के अनुसार

पार्स इनकमिंग रिक्वेस्ट बॉडीज इन ए मिडलवेयर आपके हैंडलर से पहले, req.body प्रॉपर्टी के तहत उपलब्ध।

जैसा कि आपने पहले उदाहरण में देखा, हमें शरीर को निकालने के लिए मैन्युअल रूप से आने वाली अनुरोध धारा को पार्स करना था। यह एक थकाऊ थकाऊ हो जाता है जब विभिन्न प्रकार के कई रूप डेटा होते हैं। इसलिए हम बॉडी-पार्सर पैकेज का उपयोग करते हैं जो हुड के तहत यह सब कार्य करता है।

यह विभिन्न प्रकार के डेटा को पार्स करने के लिए चार मॉड्यूल प्रदान करता है

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

req.bodyपार्स किए गए बॉडी पर सेट होने के बाद , बॉडी-पार्सर next()अगले मिडलवेयर को स्टैक के नीचे कॉल करने के लिए इनवाइट करेगा , जो तब बिना सोचे समझे और इसे पार्स करने के बारे में सोचे बिना रिक्वेस्ट डेटा को एक्सेस कर सकता है।

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