2014-10-13 11 views
14

मैं अपने Node.js सर्वर पर भेजे गए एक पोस्ट अनुरोध के फॉर्म-डेटा को पुनर्प्राप्त नहीं कर सकता। मैं सर्वर कोड और पोस्ट अनुरोध नीचे रख दिया है (क्रोम में डाकिया का उपयोग करके भेजा):नोड.जेएस (एक्सप्रेस और बॉडी पार्सर के साथ): पोस्ट अनुरोध से फॉर्म-डेटा प्राप्त करने में असमर्थ

पोस्ट अनुरोध

POST /api/login HTTP/1.1 
Host: localhost:8080 
Cache-Control: no-cache 

----WebKitFormBoundaryE19zNvXGzXaLvS5C 
Content-Disposition: form-data; name="userName" 

jem 
----WebKitFormBoundaryE19zNvXGzXaLvS5C 

NodeJS सर्वर कोड

var express = require('express');  // call express 
var app  = express();     // define our app using express 
var bodyParser = require('body-parser'); 

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

app.all('/*', function(req, res, next) { 
    res.header('Access-Control-Allow-Origin', '*'); 
    res.header('Access-Control-Allow-Headers', 'Content-Type,accept,access_token,X-Requested-With'); 
    next(); 
}); 

var port = process.env.PORT || 8080;  // set our port 

var router = express.Router();    // get an instance of the express Router 

router.get('/', function(req, res) { 

    res.json({ message: 'I am groot!' }); 
}); 

// Login 
router.route('/login') 

    .post(function(req, res){ 

     console.log('Auth request recieved'); 

     // Get the user name 
     var user = req.body.userName; 

     var aToken = getToken(user); 

     res.json({ 

      'token':'a_token' 
     }); 
    }); 

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

app.listen(port); 

प्रवेश विधि req.body.userName प्राप्त करने का प्रयास करता है - हालांकि, req.body हमेशा खाली रहता है। मैंने SO पर अन्य मामलों को ऐसे व्यवहार का वर्णन किया है लेकिन संबंधित उत्तरों में से कोई भी यहां लागू नहीं हुआ है।

मदद करने के लिए धन्यवाद।

+3

मुद्दा यह है कि अनुरोध का शरीर [एक 'मल्टीपार्ट' संदेश] (http://en.wikipedia.org/wiki/MIME#Multipart_messages) और 'बॉडी-पार्सर' मॉड्यूल पार्सिंग डेटा का समर्थन नहीं करता है वह प्रारूप [इसके रीडमेम में दूसरा अनुच्छेद] (https://www.npmjs.org/package/body-parser#readme) अन्य मॉड्यूल के लिए सुझाव प्रदान करता है जिनका आप उपयोग कर सकते हैं। –

+2

या, यदि 'POST' अनुरोध में डेटा को' मल्टीपार्ट 'की आवश्यकता नहीं है, तो इसे ['x-www-form-urlencoded'] के रूप में भेजा जा सकता है (http://en.wikipedia.org/wiki/Percent- एन्कोडिंग # The_application.2Fx-www फार्म-urlencoded_type)। यह प्रारूप है कि 'bodyParser.urlencoded() 'parses। –

+0

दरअसल, इंगित करने के लिए धन्यवाद। HTTP का मेरा ज्ञान सीमित है, इसलिए फॉर्म-urlencoded के बारे में पता नहीं था। इस तरह, मेरे नोड.जेएस छोटे कोणीय अग्रभाग से पोस्ट अनुरोधों को सही तरीके से संभाल सकते हैं। सहायता के लिए धन्यवाद! – Jem

उत्तर

16

सामान्य रूप से, एक एक्सप्रेस ऐप को के लिए शरीर को रखने के लिए उचित body-parser middleware निर्दिष्ट करने की आवश्यकता होती है।

[संपादित]

  1. आप url- एन्कोडेड (गैर बहुखण्डीय) प्रपत्र डेटा, साथ ही JSON की पार्स करने की आवश्यकता है, तो जोड़ने का प्रयास करें:

    // Put this statement near the top of your module 
    var bodyParser = require('body-parser'); 
    
    
    // Put these statements before you define any routes. 
    app.use(bodyParser.urlencoded()); 
    app.use(bodyParser.json()); 
    

    सबसे पहले, आप करेंगे body-parser को dependencies पर अपने package.json की संपत्ति जोड़ने की आवश्यकता है, और उसके बाद npm update करें।

  2. बहु-भाग फ़ॉर्म डेटा को संभालने के लिए, bodyParser.urlencoded() बॉडी पार्सर काम नहीं करेगा। मल्टीपार्ट निकायों को पार्स करने के लिए suggested modules here देखें।

+2

ओपी दिखाता है कि 'बॉडी-पार्सर' का उपयोग किया जा रहा है। मॉड्यूल, हालांकि, 'मल्टीपार्ट' पार्सिंग का समर्थन नहीं करता है। –

+1

मैंने मल्टीपार्ट फॉर्म पार्सिंग के लिए सुझाए गए मॉड्यूल का संदर्भ शामिल करने के लिए अपना उत्तर संपादित किया है। संदर्भ के लिए @ जोनाथन के लिए धन्यवाद। – cybersam

+0

सहायता के लिए धन्यवाद। दरअसल, मैं फॉर्म-डेटा भेज रहा था, यह नहीं जानता कि सर्वर यूआरएल-एन्कोडेड डेटा स्वीकार करने में सक्षम था। यह बाद के साथ काम करता है। – Jem

1

फ़ाइल अपलोड का समर्थन करने वाले मल्टीपार्ट/फॉर्म-डेटा अनुरोध को संभालने के लिए, आपको मल्टर मॉड्यूल का उपयोग करने की आवश्यकता है। npm link for multer middleware

+0

मल्टी प्रक्रिया अपलोड करने से पहले पोस्ट से शरीर को कैसे पढ़ा जाए? –

संबंधित मुद्दे