req.body पदों पर खाली


255

यह सब अचानक से मेरी सभी परियोजनाओं के लिए हो रहा है।

जब भी मैं एक्सप्रेस और बॉडी-पार्सर req.bodyका उपयोग करके नोडज में एक पोस्ट करता हूं, तो एक खाली वस्तु है।

var express    = require('express')
var bodyParser = require('body-parser')

var app = express()

// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded())

// parse application/json
app.use(bodyParser.json())

app.listen(2000);

app.post("/", function (req, res) {
  console.log(req.body) // populated!
  res.send(200, req.body);
});

अजाक्स और डाकिया के माध्यम से यह हमेशा खाली है।

हालांकि कर्ल के माध्यम से

$ curl -H "Content-Type: application/json" -d '{"username":"xyz","password":"xyz"}' http://localhost:2000/

यह इरादा के अनुसार काम करता है।

मैंने Content-type : application/jsonपूर्व में मैन्युअल रूप से सेटिंग करने की कोशिश की , लेकिन मैं हमेशा मिलता हूं400 bad request

यह मुझे पागल कर रहा है।

मैंने सोचा था कि बॉडी-पार्सर में कुछ अपडेट किया गया था लेकिन मैंने डाउनग्रेड किया और इससे कोई फायदा नहीं हुआ।

किसी भी मदद की सराहना की, धन्यवाद।


16
तो आपने Content-Typeपोस्टमैन को स्पष्ट रूप से सेट करने की कोशिश की ? यदि नहीं, तो आप कोशिश कर सकते हैं, जैसा कि मैंने पहले भी पोस्टमैन के साथ कोई समस्या नहीं है Content-Type
mscdex

हाँ, मैंने किया। यह तब है जब मैंने 400: अमान्य जोंस
जोसेफ डेली

@mscdex - धन्यवाद मैंने पोस्टमैन में कंटेंट-टूप सेट नहीं किया था और पागल हो रहा था :)
मुज़फ़्फ़र अली

उन लोगों के लिए जो यहां आ रहे हैं क्योंकि वे अपने एपीआई से फाइल भेजने / अपलोड करने की इच्छा रखते हैं और इस तरह उन्हें फॉर्म-डेटा का उपयोग करना पड़ता है। प्रपत्र डेटा को संभालने के लिए आपको कुछ चाहिए: npmjs.com/package/multer बहुत लोकप्रिय पैकेज है।
भास्कर

कोई फर्क नहीं पड़ता, पोस्टमैन पूर्णांकों और फ्लोट मूल्यों के साथ बहुत अच्छी तरह से व्यवहार नहीं करता है। यदि आपके पास पूर्णांक या फ्लोट मान हैं, तो कुंजियों और मानों दोनों को डबल कोट करना सुनिश्चित करें
anabeto93

जवाबों:


272

सामग्री प्रकार के लिए उपलब्ध 3 विकल्पों के पोस्टमैन में "X-www-form-urlencoded" का चयन करें और इसे काम करना चाहिए।

इसके अलावा त्रुटि संदेश से छुटकारा पाने के लिए:

app.use(bodyParser.urlencoded())

साथ में:

app.use(bodyParser.urlencoded({
  extended: true
}));

Https://github.com/expressjs/body-parser देखें

'बॉडी-पार्सर' मिडलवेयर केवल JSON और urlencoded डेटा को हैंडल करता है, मल्टीपार्ट को नहीं


डाकिया के लिए काम किया, मुझे यकीन नहीं है कि यह अजाक्स के साथ काम करता है क्योंकि मैंने कुछ भी नहीं बदला।
जोसेफ डेली

किसी कारण से HTTP पोस्ट्स को Angular के माध्यम से URL एनकोडेड करने की आवश्यकता नहीं थी, लेकिन ajax कॉल ने किया। किसी को पता है क्यों?
यंगर्रर

यह मेरे लिए काम करता है, हालांकि यह कच्चे एन्कोडेड के साथ काम क्यों नहीं कर रहा था?
डैनियल कोबे

9
अब बॉडी-पार्सर को एक्सप्रेस के साथ इनबिल्ट किया जाता है। बस उपयोग करेंapp.use(express.json());
सुजीत अग्रहरी

आपको बहुत - बहुत धन्यवाद! लंबे समय के बाद इसका उत्तर दिया गया है, यह अभी भी प्रासंगिक है।
स्प्रे'न'प्रे

217

पोस्टमैन के साथ, एक कच्चे JSON डेटा पेलोड के साथ HTTP पोस्ट कार्यों का परीक्षण करने के लिए, rawविकल्प का चयन करें और निम्नलिखित हेडर पैरामीटर सेट करें:

Content-Type: application/json

इसके अलावा, दोहरे उद्धरण चिह्नों में आपके JSON पेलोड में कुंजी / मान के रूप में उपयोग किए गए किसी भी तार को लपेटना सुनिश्चित करें।

body-parserपैकेज ठीक बहु लाइन कच्चे JSON पेलोड पार्स होगा।

{
    "foo": "bar"
}

नीचे दिए गए सेटअप के साथ पोस्टमैन v0.8.4.13 एक्सटेंशन ( v1.12.2 body-parserऔर expressv4.12.3) के साथ क्रोम v37 और v41 में परीक्षण किया गया:

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

// configure the app to use bodyParser()
app.use(bodyParser.urlencoded({
    extended: true
}));
app.use(bodyParser.json());

// ... Your routes and methods here

डाकिया कच्चे जूस पेलोड


अरे यार, मुझे कैसे याद आया कि मैंने JSON ऑब्जेक्ट को ठीक से फॉर्मेट किए गए JSON ऑब्जेक्ट के बजाय एक जेएस ऑब्जेक्ट शाब्दिक चिपकाया था ...: -S ... दोस्त!
वेस जॉनसन

दोहरे उद्धरण चिह्नों में कुंजी / मूल्यों के रूप में उपयोग किए जाने वाले किसी भी तार को लपेटना ... आसानी से छूटना लेकिन कुल सौदा ब्रेकर अन्यथा! धन्यवाद।
२०:४५ पर loxyboi

स्क्रीनशॉट का अच्छा उपयोग।
Xan- कुन क्लार्क-डेविस

जब form-dataडेटा पोस्ट करने के लिए पोस्टमैन में उपयोग किया जाता है, तो मुझे हमेशा {}req.body में मिलता है । क्या मुझे Content-Typeविकल्प निर्धारित करना चाहिए ?
मिंगचू

56

मैंने वास्तव में गूंगा गलती की और nameअपनी html फ़ाइल में इनपुट के लिए विशेषताओं को परिभाषित करना भूल गया ।

इसलिए इसके बजाय

<input type="password" class="form-control" id="password">

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

<input type="password" class="form-control" id="password" name="password">

अब request.bodyइस तरह आबाद है:{ password: 'hhiiii' }


1
बैम। यही समस्या थी। धन्यवाद!
मैट वेस्ट

यह वास्तव में मेरी समस्या थी, नाम मूल्यों के बिना एक फार्म इनपुट, इसे जानने की कोशिश में घंटों बिताए। धन्यवाद।
19

37

मुझे पता चला, कि यह सामग्री प्रकार के साथ भेजने पर काम करता है

"Application / json"

सर्वर-साइड के साथ संयोजन में

app.use(bodyParser.json());

अब मैं के माध्यम से भेज सकते हैं

var data = {name:"John"}
var xmlHttp = new XMLHttpRequest();
xmlHttp.open("POST", theUrl, false); // false for synchronous request
xmlHttp.setRequestHeader("Content-type", "application/json");
xmlHttp.send(data);

और परिणाम request.body.nameसर्वर पर उपलब्ध है ।


Upvote के लिए धन्यवाद। मुझे वास्तव में लगता है कि यह सबसे साफ है, हालांकि सबसे सरल समाधान नहीं है, क्योंकि आपको सही सामग्री प्रकार वैसे भी भेजनी चाहिए। मुझे लगता है।
Xan- कुन क्लार्क-डेविस

यह जवाब है!
जेल

मेरे मामले में मुझे इसे बदलना थाxmlHttp.send(JSON.stringify(data));
endo64

18

मैं आज इस समस्या में भाग गया, और पोस्टमैन में सामग्री-प्रकार के हेडर को हटाने के लिए इसे क्या तय किया गया था ! बहुत अजीब। मामले में यहाँ जोड़ने से यह किसी को मदद करता है।

मैं यहाँ BeerLocker ट्यूटोरियल का अनुसरण कर रहा था: http://scottksmith.com/blog/2014/05/29/beer-locker-building-a-restful-api-with-node-passport/


2
मेरी भी यही समस्या थी। हेडर का "अनियंत्रित" होना (और बाहर निकल जाना) पर्याप्त नहीं था, मुझे इसे पूरी तरह से हटाना पड़ा। भले ही "</>" स्रोत बटन दिखाता है कि मैं उस हेडर को अनियंत्रित स्थिति में सामग्री-प्रकार के साथ नहीं भेज रहा था, फिर भी इसे पूरी तरह से हटाने की आवश्यकता थी।
द रीमिक्स

मैं यह नहीं पता लगा सकता कि पोस्टमैन क्रोम एक्सटेंशन में डिफ़ॉल्ट हेडर कैसे निकालें ... क्या आप शायद ऐप का उपयोग कर रहे हैं?
वेस्टलेअर्जेंटम

ओह, मैंने ऐप इंस्टॉल किया है और यह एक्सटेंशन की तुलना में बहुत बेहतर काम करता है। शोर के लिए क्षमा करें।
वेस्टलेअर्जेंटम

12

आपको यह जांचना होगा कि बॉडी-पार्सर मिडलवेयर अनुरोध के प्रकार (json, urlencoded) पर ठीक से सेट है या नहीं।

यदि आपने सेट किया है,

app.use(bodyParser.json());

फिर पोस्टमैन में आपको कच्चे के रूप में डेटा भेजना होगा।

https://i.stack.imgur.com/k9IdQ.png पोस्टमैन स्क्रीनशॉट

यदि आपने सेट किया है,

app.use(bodyParser.urlencoded({
    extended: true
}));

फिर 'x-www-form-urlencoded' विकल्प चुनना चाहिए।


उन दोनों के होने के बारे में क्या? (bodyParser.urlencoded और bodyParser.json ()) ... मैं पोस्टमैन में किसका उपयोग कर सकता हूं?
टॉमीलॉन्ग

9

मेरी समस्या यह थी कि मैं पहले मार्ग का निर्माण कर रहा था

// ...
router.get('/post/data', myController.postHandler);
// ...

और मार्ग के बाद मिडलवेयर को पंजीकृत करना

app.use(bodyParser.json());
//etc

ऐप संरचना और कॉपी और उदाहरण से एक साथ परियोजना को चिपकाने के कारण।

एक बार जब मैंने मार्ग के पहले मिडलवेयर को पंजीकृत करने का आदेश तय किया, तो यह सब काम कर गया।


धन्यवाद फिएट, सही क्रम के साथ और कच्चे टैब का उपयोग करते हुए इसने मेरे लिए आखिरी बार काम किया
एलेक्स

4

यहां तक ​​कि जब मैं पहली बार नोड.जेएस सीख रहा था, जहां मैंने इसे वेब-ऐप पर सीखना शुरू कर दिया था, तो मुझे इन सभी चीजों को मेरे रूप में अच्छी तरह से किया गया था, फिर भी मैं पोस्ट अनुरोध में मूल्यों को प्राप्त करने में सक्षम नहीं था। लंबी डिबगिंग के बाद, मुझे पता चला कि मैंने जिस रूप में प्रदान किया है, उसके enctype="multipart/form-data"कारण मैं मूल्यों को प्राप्त करने में सक्षम नहीं था। मैंने बस इसे हटा दिया और इसने मेरे लिए काम किया।


हां, इसने भी फॉर्म बॉडी पाने के लिए काम किया लेकिन फिर मेरे फॉर्म के साथ एक और समस्या पैदा हुई - मूल रूप से फाइल को अपलोड नहीं किया जा सका क्योंकि इसके लिए आवश्यकता हैenctype="multipart/form-data"
tsando

btw, बस अपनी उपरोक्त टिप्पणी में जोड़ने के लिए, मैं इस काम को पाने में कामयाब रहा multer- npmjs.com/package/multer
tsando

3

ऐसा लगता है कि यदि आप किसी भी प्रकार का उपयोग नहीं करते हैं (डिफ़ॉल्ट है application/x-www-form-urlencoded) तो आपको पाठ इनपुट फ़ील्ड मिलते हैं लेकिन आपको फ़ाइल नहीं मिलेगी।

यदि आपके पास एक फॉर्म है जहां आप टेक्स्ट इनपुट और फ़ाइल पोस्ट करना चाहते हैं तो multipart/form-dataएन्कोडिंग प्रकार का उपयोग करें और इसके अलावा multerमिडलवेयर का उपयोग करें । Multer अनुरोध ऑब्जेक्ट को पार्स करेगा और req.fileआपके लिए तैयार करेगा और अन्य सभी इनपुट फ़ील्ड के माध्यम से उपलब्ध होगा req.body


1
धन्यवाद - multerवास्तव में मेरी समस्या का समाधान था। यह अच्छा होगा यदि आप अपने जवाब के हिस्से के रूप में इसका उपयोग करने के बारे में एक उदाहरण जोड़ सकते हैं
tsando

2

इसी तरह की एक समस्या मेरे साथ हुई, मैंने बस कॉलबैक के आदेशों को मिलाया। सुनिश्चित करें कि आपके कॉलबैक फ़ंक्शंस को सही क्रम में सेट कर रहे हैं। कम से कम किसी के लिए भी यही समस्या है।

router.post('/', function(req, res){});

2

यह सुनिश्चित करें कि ["कुंजी": "टाइप", "मूल्य": "json"] और ["कुंजी": "सामग्री-प्रकार", "मूल्य": "आवेदन / x-www-form-urlencoded"] आपके में है डाकिया अनुरोध हेडर


2

मैंने इसे multerऊपर दिए गए सुझाव के अनुसार हल किया है, लेकिन वे ऐसा करने के तरीके पर एक पूर्ण काम करने का उदाहरण देने से चूक गए। मूल रूप से यह तब हो सकता है जब आपके पास एक फॉर्म समूह हो enctype="multipart/form-data"। यहाँ मेरे पास फॉर्म के लिए HTML है:

<form action="/stats" enctype="multipart/form-data" method="post">
  <div class="form-group">
    <input type="file" class="form-control-file" name="uploaded_file">
    <input type="text" class="form-control" placeholder="Number of speakers" name="nspeakers">
    <input type="submit" value="Get me the stats!" class="btn btn-default">            
  </div>
</form>

और यहाँ कैसे उपयोग करने के लिए है multerके साथ मूल्यों और इस फार्म के नाम पाने के लिए Express.jsऔर node.js:

var multer  = require('multer')
var upload = multer({ dest: './public/data/uploads/' })
app.post('/stats', upload.single('uploaded_file'), function (req, res) {
   // req.file is the name of your file in the form above, here 'uploaded_file'
   // req.body will hold the text fields, if there were any 
   console.log(req.file, req.body)
});

1

मुझे कुछ मिनट पहले भी यही समस्या थी, मैंने उपरोक्त उत्तरों में हर संभव कोशिश की लेकिन उनमें से किसी ने भी काम किया।

केवल एक चीज जो मैंने किया, वह था नोड जेएस संस्करण का उन्नयन, मुझे नहीं पता था कि उन्नयन किसी चीज में प्रभावित हो सकता है, लेकिन यह किया।

मैंने नोड जेएस संस्करण 10.15.0(नवीनतम संस्करण) स्थापित किया है , मैं वापस आ गया हूं 8.11.3और अब सब कुछ काम कर रहा है। शायद body-parserमॉड्यूल को इस पर एक तय करना चाहिए।


1

मेरे इनपुट में मेरा नाम नहीं था ... मेरा अनुरोध रिक्त था ... खुशी है कि समाप्त हो गया है और मैं कोडिंग रख सकता हूं। सबको धन्यवाद!

जवाब मैं जेसन किम द्वारा इस्तेमाल किया:

इसलिए इसके बजाय

<input type="password" class="form-control" id="password">

मेरे पास यह है

<input type="password" class="form-control" id="password" name="password">

1

JSON.stringify(data)नीचे की तरह AJAX के माध्यम से भेजते समय आपको ऐसा नहीं करना चाहिए ।

यह सही कोड नहीं है:

function callAjax(url, data) {
    $.ajax({
        url: url,
        type: "POST",
        data: JSON.stringify(data),
        success: function(d) {
            alert("successs "+ JSON.stringify(d));
        }
    });
}   

सही कोड है:

function callAjax(url, data) {
    $.ajax({
        url: url,
        type: "POST",
        data: data,
        success: function(d) {
            alert("successs "+ JSON.stringify(d));
        }
    });
}

यहां एक महत्वपूर्ण बात यह है कि टाइप करें, सुनिश्चित करें कि आप "POST" को कैपिटल में रखते हैं। मैंने ऐसे उदाहरण देखे हैं जहां सिर्फ "पोस्ट" का उपयोग करने से रिक्त req.body हो जाता है।
मैट सी।

1

यदि आप डाकिया के साथ कर रहे हैं, तो कृपया एपीआई का अनुरोध करते समय इन सामानों की पुष्टि करें

यहां छवि विवरण दर्ज करें


0

मैं एक्सप्रेस की जगह रिस्टोर का इस्तेमाल कर रहा था और उसी समस्या में भाग गया। समाधान करना था:

server.use(restify.bodyParser());


0

app.use(bodyParser.urlencoded());अपने कोड में बदलें

app.use(bodyParser.urlencoded({extended : false}));

और पोस्टमैन में, हेडर Content-Typeसे मूल्य में परिवर्तन होता application/x-www-form-urlencodedहैapplication/json

टा :-)


0

आपके शानदार जवाब के लिए आप सभी का धन्यवाद! काफी कुछ समय एक समाधान की खोज में बिताया, और मेरी तरफ से मैं एक प्राथमिक गलती कर रहा था: मैं bodyParser.json()फ़ंक्शन के भीतर से कॉल कर रहा था :

app.use(['/password'], async (req, res, next) => {
  bodyParser.json()
  /.../
  next()
})

मुझे बस करने की जरूरत है app.use(['/password'], bodyParser.json())और यह काम किया ...


0

पोस्टमैन में, स्वीकृत उत्तर का पालन करने के बाद भी, मुझे एक खाली अनुरोध निकाय मिल रहा था। यह मुद्दा एक हेडर के रूप में पारित नहीं हो पाया है

Content-Length : <calculated when request is sent>

यह हेडर डिफ़ॉल्ट रूप से (5 अन्य लोगों के साथ) मौजूद था जिसे मैंने अक्षम कर दिया है। इसे सक्षम करें और आपको अनुरोध निकाय प्राप्त होगा।


0

मेरी समस्या यह थी कि पहले require("./routes/routes")(app); मैंने इसे कोड के अंत में स्थानांतरित कर दिया था app.listen और यह काम कर रहा था!

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