एक्सप्रेस .js req.body अपरिभाषित


291

मेरे पास मेरे एक्सप्रेस सर्वर के कॉन्फ़िगरेशन के रूप में है

app.use(app.router); 
app.use(express.cookieParser());
app.use(express.session({ secret: "keyboard cat" }));
app.set('view engine', 'ejs');
app.set("view options", { layout: true });
//Handles post requests
app.use(express.bodyParser());
//Handles put requests
app.use(express.methodOverride());

लेकिन फिर भी जब मैं req.body.somethingअपने मार्गों के लिए पूछता हूं तो मुझे कुछ त्रुटि मिलती है जो इंगित करती है body is undefined। यहां एक मार्ग का उदाहरण दिया गया है जो उपयोग करता है req.body:

app.post('/admin', function(req, res){
    console.log(req.body.name);
});

मैंने पढ़ा कि यह समस्या कमी के कारण होती है, app.use(express.bodyParser());लेकिन जैसा कि आप देख सकते हैं कि मैं मार्गों से पहले इसे कॉल करता हूं।

कोई सुराग?

जवाबों:


296

आपको यह सुनिश्चित करना चाहिए कि आप सभी कॉन्फ़िगरेशन को परिभाषित करने वाले मार्गों से परिभाषित करें। यदि आप ऐसा करते हैं, तो आप उपयोग जारी रख सकते हैं express.bodyParser()

एक उदाहरण इस प्रकार है:

var express = require('express'),
    app     = express(),
    port    = parseInt(process.env.PORT, 10) || 8080;

app.configure(function(){
  app.use(express.bodyParser());
  app.use(app.router);
});

app.listen(port);

app.post("/someRoute", function(req, res) {
  console.log(req.body);
  res.send({ status: 'SUCCESS' });
});

9
इसने मेरे लिए काम किया। नोट: दुर्भाग्य से, कुछ ट्यूटोरियल में लोग हैं (मेरे जैसे) ऐप से पहले मार्ग डालते हैं। कॉन्फ़िगर ()। मेरे मामले में यह app.get / पोस्ट आदि के रूप में था, और उनमें एक आवश्यकता () भी शामिल थी।
बेंडमैन

1
बहुत बहुत धन्यवाद, मैं पूरे दिन इस समस्या का निवारण कर रहा हूं।
jfplataroti

11
एक्सप्रेस 4 के अनुसार, app.use (app.router) को हटा दिया जाता है। डॉक्स github.com/visionmedia/express/wiki/New-features-in-4.x
जोनाथन ओंग

15
एक्सप्रेस 4 के रूप में, बॉडीपेयर जैसे मिडवेअर को अब एक्सप्रेस के साथ बंडल नहीं किया जाता है और इसे अलग से स्थापित किया जाना चाहिए। आप यहाँ और अधिक जानकारी प्राप्त कर सकते हैं: github.com/senchalabs/connect#middleware
andrea.rinaldi

2
धन्यवाद। यह उत्तर 2 साल से अधिक पुराना है और अभी भी लोगों को परेशानी में मदद करता है :)
लोरेंजो मार्कोन

275

एक्सप्रेस के नवीनतम संस्करणों (4.x) ने कोर फ्रेमवर्क से मिडलवेयर को हटा दिया है। यदि आपको बॉडी पार्सर की आवश्यकता है, तो आपको इसे अलग से इंस्टॉल करना होगा

npm install body-parser --save

और फिर अपने कोड में ऐसा करें

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

// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: false }))

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

2
मैंने हाल ही में 4.x को व्यक्त करने के लिए अद्यतन किया। प्रारंभ में जब मैं req.body लॉग इन करने की कोशिश कर रहा था तो यह मुझे अपरिभाषित दिखा रहा था। एक बार जब मैंने बॉडी-पार्सर को स्थापित और उपयोग कर लिया है, तो यह मुझे अपेक्षित req.body मान दे रहा है। :)
आलोक अधो

मुझे यह उपयोगी लगा जब वर्कआउट करने की कोशिश कर रहा था कि मेरे POST अनुरोध json-server के साथ काम क्यों नहीं कर रहे थे।
8:14 बजे

मेरा दिन बचाया, विशेष रूप से हिस्सा 'app.use (bodyParser.json ())'। धन्यवाद भाई ! : D
neaGaze

यह स्वीकृत उत्तर होना चाहिए क्योंकि यह पूरी तरह से एक्सप्रेस 4 के लिए काम करता है! धन्यवाद महोदय!
मिलाएं

2
app.use(bodyParser.urlencoded({ extended: false })); app.use(bodyParser.json()) मुझे बचाया !!
प्रमेश बजराचार्य

71

नहीं। आपको app.use(express.bodyParser())पहले उपयोग करने की आवश्यकता है app.use(app.router)। वास्तव में, app.use(app.router)आपको कॉल करने वाली आखिरी चीज होनी चाहिए।


कॉल के app.use(app.router)नीचे जाने से भी .useसमस्या हल नहीं होती है :(।
Masiar

ठीक है थोड़े संघर्ष के बाद मैंने इसे हल करने के app.use(require('connect').bodyParser());बजाय इसका उपयोग किया app.use(express.bodyParser());
मासियार

हाँ, उत्तर का उपयोग करते समय भी सच है var router=express.Router();
इस्तियाक अहमद

1
थोड़ा सा परिशिष्ट, आपको अभी भी एरर-हैंडलिंग मिडलवेयर को ऐप के बाद कॉल करना चाहिए।
शिल्प

आशीर्वाद इस टिप्पणी
Ke Ke

40

पहले सुनिश्चित करें, आपने npm मॉड्यूल स्थापित किया है जिसका नाम 'बॉडी-पार्सर' है:

npm install body-parser --save

फिर सुनिश्चित करें कि आपने मार्गों को कॉल करने से पहले निम्नलिखित पंक्तियों को शामिल किया है

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

app.use(bodyParser.json());

यदि यह एक्सप्रेस.जॉन का उपयोग कर रहा है, तो बॉडी-पार्सर का आयात क्यों करें?
SanSolo

38

एक्सप्रेस 4, में बिल्ड-बॉडी पार्सर है। अलग बॉडी-पार्सर स्थापित करने की आवश्यकता नहीं है। तो नीचे काम करेंगे:

export const app = express();
app.use(express.json());

37

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

सुनिश्चित करें कि आप एप्लिकेशन / x-www-form-urlencoded, एप्लिकेशन / json या अन्य जैसी किसी चीज़ का उपयोग कर रहे हैं, यह आपके पोस्ट डेटा पर निर्भर करता है। इस फील्ड को खाली छोड़ दें एक्सप्रेस को भ्रमित करेंगे।


12
+1 यह मेरे लिए समस्या थी। मैं REST में निर्मित JSON एपि का परीक्षण करने के लिए Postman का उपयोग क्रोम के लिए कर रहा था, लेकिन एक्सप्रेस द्वारा प्राप्त वस्तु हर बार खाली थी। पोस्टमैन डिफ़ॉल्ट रूप से चालू हो जाता है, भले ही आप कच्चे> जसन का चयन करते हुए भी 'सामग्री-प्रकार: अनुप्रयोग / json' शीर्षक नहीं जोड़ते हैं।
जॉर्डन

@ जोर्डन +1 इसे इंगित करने के लिए धन्यवाद। वास्तव में मैंने अभी-अभी अपने हेडर चेक किए हैं और मुझे लगता है कि यह अभी भी 'टेक्स्ट / प्लेन' पर सेट है, भले ही मैंने 'जसन' को चुना हो।
इंजीनियर

उह ... 7 साल बाद और यह अभी भी मुझे क्या कर रहा है ...
शौन 314

33

जैसा कि पहले से ही एक टिप्पणी के तहत पोस्ट किया गया था, मैंने इसका उपयोग करके हल किया

app.use(require('connect').bodyParser());

के बजाय

app.use(express.bodyParser());

मैं अभी भी नहीं जानता कि साधारण express.bodyParser()काम क्यों नहीं कर रहा है ...


1
@ मासीर यह मेरे लिए काम नहीं कर रहा है। मैं एक्सप्रेस 4 का उपयोग कर रहा हूं और मुझे इस तरह की त्रुटि मिलती है। त्रुटि: मॉड्यूल को 'कनेक्ट' नहीं कर सकता है
ज्यारथनेम जेयाचेंथुरु

1
@JeyTheva मेरा एक बहुत पुराना समाधान है, इस प्रकार चीजें समय के साथ बदल सकती हैं। मेरा सुझाव है कि आप connectमॉड्यूल को स्थापित करने npm install connectऔर पुन: प्रयास करने के लिए प्रयास करें। यह केवल एक चीज है जिसे मैं आपकी त्रुटि के आउटपुट को पढ़कर सोच सकता हूं।
मासियार

4
यहाँ इस मुद्दे को हल करने के लिए नवीनतम दस्तावेज़ है: npmjs.com/package/body-parser दूसरों के लिए जो इस मुद्दे को "पोस्ट एक्सप्रेस 4" का अनुभव करते हैं, मेरे लिए जो काम किया था वह Content-Typeहेडर को सेट कर रहा था application/json
ग्रांट एगन

3
इस समस्या को हल करने के लिए यहां नवीनतम दस्तावेज़ है: npmjs.com/package/body-parser बॉडी-पार्सर स्थापित होने के बाद, यह अभी भी काम नहीं करेगा। जब मैं अपना अनुरोध कर रहा था तब Content-Typeहेडर किस काम का था application/json
अनुदान Eagon

1
application/jsonबनाम text/jsonअनुरोध कार्यों में, जैसा कि @GrantEagon द्वारा सुझाया गया है।
स्ट्राइडर

21
// Require body-parser (to receive post data from clients)

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

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

// parse application/json

app.use(bodyParser.json())

20

अपने में जोड़ें app.js

राउटर के कॉल से पहले

const app = express();
app.use(express.json());

2
आपने मेरा दिन बचाया! कॉल राउटर से पहले कुंजी को लाइन में जोड़ा जाता है
ubaldisney

इस चीज ने मुझे बचा लिया। धन्यवाद :)
फारुख

12

ऐसा लगता है कि बॉडी-पार्सर को अब एक्सप्रेस के साथ नहीं भेजा जाता है। हमें इसे अलग से स्थापित करना पड़ सकता है।

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

// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: false }))

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

// parse application/vnd.api+json as json
app.use(bodyParser.json({ type: 'application/vnd.api+json' }))
app.use(function (req, res, next) {
console.log(req.body) // populated!

अधिक जानकारी और उदाहरणों के लिए git पृष्ठ https://github.com/expressjs/body-parser देखें


1
यह नया एक्सप्रेस 4.x प्रारूप प्रतीत होता है और मेरे लिए काम करता है। अन्य जवाबों में वर्णित एक्सप्रेस .bodyParser () 4.x में काम नहीं करता है।
DustinB

10

मामले में कोई भी उसी मुद्दे पर चलता है जो मैं कर रहा था; मैं एक यूआरएल उपसर्ग का उपयोग कर रहा हूँ जैसे

http://example.com/api/

जो राउटर के साथ सेटअप किया गया था

app.use('/api', router); 

और फिर मेरे पास निम्नलिखित थे

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

क्या तय किया मेरा मुद्दा ऊपर bodyparser विन्यास रख रहा था app.use('/api', router);

अंतिम

// setup bodyparser
    app.use(bodyParser.json());
    app.use(bodyParser.urlencoded({ extended: true }));

//this is a fix for the prefix of example.com/api/ so we dont need to code the prefix in every route
    app.use('/api', router); 

9

express.bodyParser () को यह बताने की जरूरत है कि यह किस प्रकार की सामग्री है जो इसे पार्स कर रही है। इसलिए, आपको यह सुनिश्चित करने की आवश्यकता है कि जब आप POST अनुरोध निष्पादित कर रहे हों, तो आप "सामग्री-प्रकार" शीर्ष लेख शामिल करें। अन्यथा, bodyParser को यह पता नहीं चल सकता है कि आपके POST अनुरोध के शरीर के साथ क्या करना है।

यदि आप शरीर में कुछ JSON ऑब्जेक्ट वाले POST अनुरोध को निष्पादित करने के लिए कर्ल का उपयोग कर रहे हैं, तो यह कुछ इस तरह दिखाई देगा:

curl -X POST -H "Content-Type: application/json" -d @your_json_file http://localhost:xxxx/someRoute

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


8

App.use (bodyparser.json ()) का उपयोग करें ; रूटिंग से पहले। //। app.use ("/ एपीआई", मार्गों);


7

आप शीर्ष पर कोड की इस पंक्ति को जोड़ने की कोशिश कर सकते हैं, (आपके बयानों की आवश्यकता के बाद):

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

काम करने के कारणों के रूप में, डॉक्स की जाँच करें: https://www.npmjs.com/package/body-parser#bodyparserurlencodedoptions


मेरा मतलब है, आपका उत्तर सही है, लेकिन यह दूसरों के लिए अलग नहीं है।
dwjohnston

7

लापता JSON पार्सर के कारण अधिकांश समय req.body अपरिभाषित है

const express = require('express');
app.use(express.json());

बॉडी-पार्सर के लिए गायब हो सकता है

const bodyParser  = require('body-parser');
app.use(bodyParser.urlencoded({extended: true}));

और कभी-कभी यह फसल की उत्पत्ति के कारण अपरिभाषित होता है, इसलिए उन्हें जोड़ें

const cors = require('cors');
app.use(cors())

5

यह मुझे आज पता चला। उपरोक्त समाधानों में से कोई भी मेरे लिए काम नहीं करता है। लेकिन थोड़ी गुगली ने मुझे इस मुद्दे को हल करने में मदद की। मैं wechat 3rd पार्टी सर्वर के लिए कोडिंग कर रहा हूं।

जब आपके नोड.जेएस एप्लिकेशन को POST डेटा को पढ़ने की आवश्यकता होती है, तो चीजें थोड़ी जटिल हो जाती हैं, जैसे कि एक REST क्लाइंट से अनुरोध। इस मामले में, अनुरोध की संपत्ति "पठनीय" सही हो जाएगी और सभी सामग्री एकत्र करने के लिए POST डेटा को चंक्स में पढ़ा जाना चाहिए।

http://www.primaryobjects.com/CMS/Article144


पोस्ट में REST क्लाइंट अनुरोध से भिन्न HTML फॉर्म सबमिशन का उल्लेख है। दोनों http अनुरोध नहीं कर रहे हैं? इसलिए, POST एकमात्र मामला है जिसे स्ट्रीमिंग की आवश्यकता है?
j10

5

बहुत समय बर्बाद किया:

पर अपने में सामग्री प्रकार के आधार ग्राहक अनुरोध सर्वर अलग, app.use नीचे से एक है (होना चाहिए):

app.use(bodyParser.text({ type: 'text/html' }))
app.use(bodyParser.text({ type: 'text/xml' }))
app.use(bodyParser.raw({ type: 'application/vnd.custom-type' }))
app.use(bodyParser.json({ type: 'application/*+json' }))

स्रोत: https://www.npmjs.com/package/body-parser#bodyparsertextoptions

उदाहरण:

मेरे लिए, क्लाइंट की ओर, मेरे पास हेडर नीचे था:

Content-Type: "text/xml"

इसलिए, सर्वर साइड पर, मैंने उपयोग किया:

app.use(bodyParser.text({type: 'text/xml'}));

फिर, req.body ठीक काम किया।



4

काम करने के लिए, आपको app.use (app.router) के बाद app.use (express.bodyParser ()) की आवश्यकता है , जैसे:

app.use(express.bodyParser())
   .use(express.methodOverride())
   .use(app.router);

1
आपकी टिप्पणी और कोड स्निपेट विरोधाभासी हैं। पहले आप कहते हैं कि आपको पहले उपयोग app.useकरना है लेकिन आपका कोड स्पष्ट रूप से यह बताता है कि यह सुरक्षित है। तो कौन सा है? app.routerexpress.bodyParser
लेवी रॉबर्ट्स

1
दुखी आदमी। एक्सप्रेस के बाद आपको ऐप का उपयोग करना होगा।
हेनियोजेआर

1
साभार @LeviRoberts
हेनियोजेआर

4
var bodyParser = require('body-parser');
app.use(bodyParser.json());

इससे मेरा दिन बच गया।


4

यह समस्या हो सकती है क्योंकि आपने बॉडी-पार्सर ( लिंक ) का उपयोग नहीं किया है

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

var app = express();
app.use(bodyParser.json());

3

मैंने इसे हल किया:

app.post('/', bodyParser.json(), (req, res) => {//we have req.body JSON
});

3

यह भी एक संभावना है : सुनिश्चित करें कि आपको इस कोड को अपने app.js (या index.js) फ़ाइल में मार्ग से पहले लिखना चाहिए।

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

2

आप एक्सप्रेस बॉडी पार्सर का उपयोग कर सकते हैं।

var express = require('express');
var app = express();
var bodyParser = require('body-parser');
app.use(bodyParser.urlencoded({ extended: true }));

2

एक्सप्रेस के नवीनतम संस्करण में पहले से ही बॉडी-पार्सर बिल्ट-इन है। तो आप उपयोग कर सकते हैं:

const express = require('express);
... 
app.use(express.urlencoded({ extended: false }))
.use(express.json());

1

यदि आप SOAP संदेश पोस्ट करते हैं तो आपको कच्चे बॉडी पार्सर का उपयोग करना होगा:

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

app.use(bodyParser.raw({ type: 'text/xml' }));

1

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

मैंने बॉडी पार्सर के माध्यम से अनुरोध पारित करने से पहले सामग्री-प्रकार को स्पष्ट रूप से सेट करके इसे प्राप्त किया, जैसे:

app.use(function(req, res, next) {
    // IE9 doesn't set headers for cross-domain ajax requests
    if(typeof(req.headers['content-type']) === 'undefined'){
        req.headers['content-type'] = "application/json; charset=UTF-8";
    }
    next();
})
.use(bodyParser.json());

1

महान उत्तर के लिए @spikeyang को क्रेडिट (नीचे प्रदान की गई है)। पद से जुड़े सुझाए गए लेख को पढ़ने के बाद, मैंने अपना समाधान साझा करने का फैसला किया।

कब इस्तेमाल करें?

समाधान की आवश्यकता है ताकि आप इसे आनंद लेने के लिए एक्सप्रेस राउटर का उपयोग कर सकें .. इसलिए: यदि आपने बिना किसी भाग्य के स्वीकृत उत्तर का उपयोग करने की कोशिश की है, तो बस इस फ़ंक्शन की प्रतिलिपि बनाएँ और पेस्ट करें:

function bodyParse(req, ready, fail) 
{
    var length = req.header('Content-Length');

    if (!req.readable) return fail('failed to read request');

    if (!length) return fail('request must include a valid `Content-Length` header');

    if (length > 1000) return fail('this request is too big'); // you can replace 1000 with any other value as desired

    var body = ''; // for large payloads - please use an array buffer (see note below)

    req.on('data', function (data) 
    {
        body += data; 
    });

    req.on('end', function () 
    {
        ready(body);
    });
}

और इसे कॉल करें:

bodyParse(req, function success(body)
{

}, function error(message)
{

});

नोट: बड़े पेलोड के लिए - कृपया एक सरणी बफ़र का उपयोग करें ( अधिक @ MDN )


bodyParser पैकेज आमतौर पर उपयोग किया जाता है और पेलोड को एक बॉडी ऑब्जेक्ट में बदल देता है। जैसा कि अन्य उत्तरों में प्रदान किया गया है
Schuere

1

यदि आप अनुरोध करने के लिए कुछ बाहरी टूल का उपयोग कर रहे हैं, तो हेडर जोड़ना सुनिश्चित करें:

Content-Type: application/json


इसने मेरी मदद की, मैं पोस्टमैन के साथ काम कर रहा था, धन्यवाद दोस्त।
आर। गुरुंग

1

उन सभी लोगों के लिए जो ऊपर दिए गए किसी भी उत्तर के लिए काम नहीं करते हैं, मुझे अपने सामने के अंत और एक्सप्रेस के बीच कॉर्स को सक्षम करना था।

आप ऐसा कर सकते हैं:

  1. आपके ब्राउज़र के लिए एक CORS एक्सटेंशन डाउनलोड और चालू करना, जैसे:

    https://chrome.google.com/webstore/detail/allow-control-allow-origi/nlfbmbojpeacfghkpbjhddihlkkiljbi?hl=en

    क्रोम के लिए,

या द्वारा

  1. रेखाओं को जोड़ना

    var cors=require('cors');
    
    app.use(cors());

अपने एक्सप्रेस app.jsपृष्ठ पर। (के बाद npm install cors)

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