Node.js में POST डेटा को कैसे प्रोसेस करें?


636

आप Node.js में form[method="post"]HTTP POSTपद्धति से भेजे गए फ़ॉर्म डेटा ( ) और फ़ाइल अपलोड कैसे निकालते हैं ?

मैंने प्रलेखन पढ़ा है, गुगली की और कुछ नहीं मिला।

function (request, response) {
    //request.post????
}

क्या कोई पुस्तकालय या हैक है?

जवाबों:


551

यदि आप एक्सप्रेस (उच्च-प्रदर्शन, Node.js के लिए उच्च-स्तरीय वेब विकास) का उपयोग करते हैं, तो आप ऐसा कर सकते हैं:

HTML:

<form method="post" action="/">
    <input type="text" name="user[name]">
    <input type="text" name="user[email]">
    <input type="submit" value="Submit">
</form>

API क्लाइंट:

fetch('/', {
    method: 'POST',
    headers: {
        'Content-Type': 'application/json'
    },
    body: JSON.stringify({
        user: {
            name: "John",
            email: "john@example.com"
        }
    })
});

Node.js: (एक्सप्रेस v4.16.0 के बाद से)

// Parse URL-encoded bodies (as sent by HTML forms)
app.use(express.urlencoded());

// Parse JSON bodies (as sent by API clients)
app.use(express.json());

// Access the parse results as request.body
app.post('/', function(request, response){
    console.log(request.body.user.name);
    console.log(request.body.user.email);
});

Node.js: (एक्सप्रेस <4.16.0 के लिए)

const bodyParser = require("body-parser");

/** bodyParser.urlencoded(options)
 * Parses the text as URL encoded data (which is how browsers tend to send form data from regular forms set to POST)
 * and exposes the resulting object (containing the keys and values) on req.body
 */
app.use(bodyParser.urlencoded({
    extended: true
}));

/**bodyParser.json(options)
 * Parses the text as JSON and exposes the resulting object on req.body.
 */
app.use(bodyParser.json());

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

45
कार्यक्षमता वास्तव में बॉडीपार मॉड्यूल में कनेक्ट है, यदि आप निचले स्तर के प्रवेश बिंदु का उपयोग करना चाहते हैं।
जूलियन बर्च

14
मैं उलझन में हूं। कैसे नाम = "उपयोगकर्ता [ईमेल]" request.body.email के अनुरूप है?
14:16 पर sbose

36
परमेश्वर!! मैं एक ही फ्रेमवर्क के लिए एक ही समय में 3 doumentations पढ़ने के लिए पागल हो रहा हूं: / nodejs.org/api/http.html , senchalabs.org/connect & expressjs.com/guide.html
सलमान वॉन

15
जब तक मैंने जोड़ा मेरे लिए यह काम नहीं किया app.use(express.bodyParser());
pettys

13
एक्सप्रेस करने के लिए क्या jQuery ग्राहक पक्ष जेएस के लिए है। हर बार जब मैं नोड के लिए Google मदद करता हूं तो मुझे ये लंगड़े "एक्सप्रेस का उपयोग करें!" जवाब। क्या पोस्ट डेटा को पार्स करना वास्तव में इतना मुश्किल है कि यह एक पूरे वेब ढांचे को स्थापित करने को सही ठहराता है?
शॉन व्हेनरी

710

आप querystringमॉड्यूल का उपयोग कर सकते हैं :

var qs = require('querystring');

function (request, response) {
    if (request.method == 'POST') {
        var body = '';

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

            // Too much POST data, kill the connection!
            // 1e6 === 1 * Math.pow(10, 6) === 1 * 1000000 ~~~ 1MB
            if (body.length > 1e6)
                request.connection.destroy();
        });

        request.on('end', function () {
            var post = qs.parse(body);
            // use post['blah'], etc.
        });
    }
}

अब, उदाहरण के लिए, यदि आपके पास inputनाम के साथ कोई फ़ील्ड है , तो आप ageचर का उपयोग करके इसे एक्सेस कर सकते हैं post:

console.log(post.age);

8
@ वे ह्म, यह एक अच्छी बात है। हालांकि, इसे जोड़ना मुश्किल नहीं होना चाहिए, इसलिए मैं चीजों को सरल रखने के लिए इसे उदाहरण से बाहर छोड़ दूंगा।
केसी चू

72
नोड.जेएस वेब सर्वर का विकास मिडलवेयर के साथ होता है जिससे आपको कोडिंग के लायक मिनट बचाने के लिए घंटों तक उनका अध्ययन करना पड़ता है। अकेले लगभग सभी को प्रस्ताव दें। और आपका आवेदन अन्य लोगों के मानदंड पर निर्भर करता है, न कि आपका। प्लस किसी भी प्रकार के प्रदर्शन के मुद्दे।
जुआन लानुस

4
var POST = qs.parse(body); // use POST केवल मेरे जैसे नोब्स के लिए: जब इनपुट टेक्स्ट फ़ील्ड का नाम "उपयोगकर्ता" है, Post.userतो उस फ़ील्ड का डेटा दिखाएगा। जैसेconsole.log(Post.user);
माइकल मूएलर

5
आप readableडेटा को बॉडी स्ट्रिंग में बनाने के बजाय कॉलबैक का उपयोग कर सकते हैं । एक बार जब यह निकाल दिया जाता है, तो शरीर के माध्यम से उपलब्ध होता हैrequest.read();
थॉमस फनकौशर

4
सूचना जो req.connection.destroy(); कॉलबैक को निष्पादित होने से नहीं रोकती है! उदाहरण के लिए "ऑन एंड" कॉलबैक को काटे गए शरीर के साथ निष्पादित किया जाएगा! यह वह नहीं है जो आप चाहते हैं ...
Collimarco

149

यदि कोई आपकी RAM को बाढ़ने की कोशिश करता है, तो कनेक्शन को मारना सुनिश्चित करें

var qs = require('querystring');

function (request, response) {
    if (request.method == 'POST') {
        var body = '';
        request.on('data', function (data) {
            body += data;
            // 1e6 === 1 * Math.pow(10, 6) === 1 * 1000000 ~~~ 1MB
            if (body.length > 1e6) { 
                // FLOOD ATTACK OR FAULTY CLIENT, NUKE REQUEST
                request.connection.destroy();
            }
        });
        request.on('end', function () {

            var POST = qs.parse(body);
            // use POST

        });
    }
}

53
आप HTTP 413 त्रुटि कोड (रिक्वेस्ट एंटिटी टू लार्ज)
neoascetic

1
@ प्रेस: ​​नहीं, यह 1 * 10 ^ 6 = 1000000 है।
thejh

@tq: इस मामले में, POST [नाम] (जैसे POST ["फू"])।
thejh

2
var POST = qs.parse(body); // use POST केवल नोब्स के लिए: जब इनपुट टेक्स्ट फ़ील्ड का नाम "उपयोगकर्ता" है, तो Post.user उस फ़ील्ड का डेटा दिखाएगा। जैसे कंसोल.लॉग (पोस्ट.यूज़र);
माइकल मूएलर

2
क्या कोई मदद कर सकता है, अगर मैं {'नाम ’:} जो’ पोस्ट करूं तो मुझे {{: नाम ’:' जो’}: s. ’} qs.Parse (POST) के बाद…
मैट कैंटी

118

यहाँ बहुत सारे उत्तर अच्छे अभ्यास नहीं हैं या कुछ भी स्पष्ट नहीं करते हैं, इसलिए मैं यह लिख रहा हूं।

मूल बातें

जब http.createServer का कॉलबैक कहा जाता है, जब सर्वर वास्तव में अनुरोध के लिए सभी हेडर प्राप्त करता है, लेकिन यह संभव है कि डेटा अभी तक प्राप्त नहीं हुआ है, इसलिए हमें इसके लिए इंतजार करना होगा। Http अनुरोध वस्तु (एक http.IncomingMessage उदाहरण) वास्तव में एक है पठनीय धारा । पठनीय धाराओं में जब भी डेटा का एक हिस्सा आता है, तो एक घटना उत्सर्जित हो जाती है (यह मानते हुए कि आपने इसे कॉलबैक दर्ज कर लिया है) और जब सभी खंड आए हैं तो एक घटना उत्सर्जित होती है। यहाँ एक उदाहरण है कि आप घटनाओं को कैसे सुनते हैं:data end

http.createServer((request, response) => {
  console.log('Now we have a http message with headers but no data yet.');
  request.on('data', chunk => {
    console.log('A chunk of data has arrived: ', chunk);
  });
  request.on('end', () => {
    console.log('No more data');
  })
}).listen(8080)

बफ़र्स को स्ट्रिंग्स में बदलना

यदि आप यह कोशिश करते हैं तो आप देखेंगे कि चूजे बफ़र हैं । यदि आप द्विआधारी डेटा के साथ काम नहीं कर रहे हैं और इसके बजाय स्ट्रिंग्स के साथ काम करने की आवश्यकता है, तो मेरा सुझाव है कि request.setEncoding का उपयोग करें विधि जो दिए गए एन्कोडिंग के साथ व्याख्या की गई धारा का उत्सर्जन करता है और मल्टी-बाइट वर्णों को ठीक से संभालता है।

बफरिंग चंक्स

अब आप शायद इसके द्वारा प्रत्येक कबाड़ में दिलचस्पी नहीं रखते हैं, इसलिए इस मामले में शायद आप इसे इस तरह से बफर करना चाहते हैं:

http.createServer((request, response) => {
  const chunks = [];
  request.on('data', chunk => chunks.push(chunk));
  request.on('end', () => {
    const data = Buffer.concat(chunks);
    console.log('Data: ', data);
  })
}).listen(8080)

यहां बफ़र.कॉनटैट का उपयोग किया जाता है, जो बस सभी बफ़र्स को समेटता है और एक बड़ा बफर वापस करता है। आप कॉनकैट-स्ट्रीम मॉड्यूल का भी उपयोग कर सकते हैं जो समान है:

const http = require('http');
const concat = require('concat-stream');
http.createServer((request, response) => {
  concat(request, data => {
    console.log('Data: ', data);
  });
}).listen(8080)

पार्सिंग सामग्री

यदि आप HTML फ़ॉर्म POST जमा करने की कोशिश कर रहे हैं, जिसमें कोई फाइल नहीं है या डिफ़ॉल्ट सामग्री प्रकार के साथ jQuery के अजाक्स कॉल को सौंपना है , तो सामग्री प्रकार एन्कोडिंग के application/x-www-form-urlencodedसाथ है uft-8। आप इसे डी-सीरियल करने और गुणों तक पहुंचने के लिए क्वेरिस्ट्रिंग मॉड्यूल का उपयोग कर सकते हैं :

const http = require('http');
const concat = require('concat-stream');
const qs = require('querystring');
http.createServer((request, response) => {
  concat(request, buffer => {
    const data = qs.parse(buffer.toString());
    console.log('Data: ', data);
  });
}).listen(8080)

यदि आपका सामग्री प्रकार JSON बजाय है, तो आप बस का उपयोग कर सकते JSON.parse के बजाय qs.parse

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

पाइपलाइन

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

इसलिए यदि आप किसी फ़ाइल में सामग्री को सहेजना चाहते हैं:

 http.createServer((request, response) => {
   request.pipe(fs.createWriteStream('./request'));
 }).listen(8080)

डेटा की मात्रा को सीमित करना

जैसा कि अन्य जवाबों ने मेरे ध्यान में रखा है कि दुर्भावनापूर्ण ग्राहक आपके एप्लिकेशन को क्रैश करने के लिए या आपकी मेमोरी को भरने के लिए एक बड़ी मात्रा में डेटा भेज सकते हैं ताकि यह सुनिश्चित करने के लिए कि आप अनुरोधों को छोड़ दें जो डेटा को फेंकना एक निश्चित सीमा को पार करते हैं। यदि आप आने वाले डेटा को संभालने के लिए लाइब्रेरी का उपयोग नहीं करते हैं। मैं स्ट्रीम-मीटर जैसी किसी चीज़ का उपयोग करने का सुझाव दूंगा जो निर्दिष्ट सीमा तक पहुंचने पर अनुरोध को रद्द कर सकती है:

limitedStream = request.pipe(meter(1e7));
limitedStream.on('data', ...);
limitedStream.on('end', ...);

या

request.pipe(meter(1e7)).pipe(createWriteStream(...));

या

concat(request.pipe(meter(1e7)), ...);

एनपीएम मॉड्यूल

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

यदि आप एक रूपरेखा का उपयोग नहीं करते हैं, तो शरीर काफी अच्छा है।


धन्यवाद, मैंने आपके कोड का उपयोग किया और मुझे रहस्यमय डुप्लिकेट संदेश मिले। क्या ऐसा हो सकता है कि चर requestका फिर से उपयोग किया जाए और request.on('end')कई बार मिला हो? मैं इससे कैसे बच सकता हूं?
यान किंग यिन

मैं यह नहीं बता सकता कि आपका कोड देखे बिना क्यों। ध्यान दें कि हर अनुरोध के लिए, request.on('end', ...)बुलाया जाएगा।
फरीद नूरी नेस्तत

यह शायद आपके कोड से असंबंधित है, मैं सर्वर द्वारा भेजे गए ईवेंट कर रहा हूं और हो सकता है कि इसे खराब कर दिया गया हो ... आपका कोड ठीक काम कर रहा है, धन्यवाद वैसे भी :)
यान किंग यिन

जब एक 'अंत' हैंडलर के बिना GET अनुरोध को संसाधित करने की तुलना में यह प्रभाव प्रदर्शन करता है, यानी बिना बफरिंग के?
JSON

1
यह यहां सवाल का सबसे अच्छा जवाब है। 🧐
montrealist

103

यहाँ पोस्ट किए गए अन्य उत्तरों और लेखों के आधार पर एक बहुत ही सरल नो-फ्रेमवर्क आवरण है:

var http = require('http');
var querystring = require('querystring');

function processPost(request, response, callback) {
    var queryData = "";
    if(typeof callback !== 'function') return null;

    if(request.method == 'POST') {
        request.on('data', function(data) {
            queryData += data;
            if(queryData.length > 1e6) {
                queryData = "";
                response.writeHead(413, {'Content-Type': 'text/plain'}).end();
                request.connection.destroy();
            }
        });

        request.on('end', function() {
            request.post = querystring.parse(queryData);
            callback();
        });

    } else {
        response.writeHead(405, {'Content-Type': 'text/plain'});
        response.end();
    }
}

उपयोग उदाहरण:

http.createServer(function(request, response) {
    if(request.method == 'POST') {
        processPost(request, response, function() {
            console.log(request.post);
            // Use request.post here

            response.writeHead(200, "OK", {'Content-Type': 'text/plain'});
            response.end();
        });
    } else {
        response.writeHead(200, "OK", {'Content-Type': 'text/plain'});
        response.end();
    }

}).listen(8000);

क्या इस चेक को एक अलग मिडलवेयर में नहीं ले जाना चाहिए ताकि यह सभी पोस्ट पर बहुत बड़े अनुरोधों की जांच कर सके / अनुरोध कर सके
Pavel Nikolov

@PavelNikolov यह ज्यादातर त्वरित और गंदे कामों के लिए है, अन्यथा किसी को एक्सप्रेस का उपयोग करने से बेहतर है कि यहां स्वीकृत उत्तर की सिफारिश की जाए (जो संभवतः बड़े अनुरोधों के प्रबंधन का भी ख्याल रखता है)। हालांकि अपनी पसंद के अनुसार इसे संशोधित और "कांटा" करने के लिए स्वतंत्र महसूस करें।
महन

.Read () विधि के बारे में क्या? क्या यह http मॉड्यूल द्वारा समर्थित नहीं है? उदाहरण के लिए। response.read ()
BT

अरे, बस जिज्ञासु - आपने पेलोड को रिक्वेस्ट ऑब्जेक्ट के बजाय रिस्पॉन्स ऑब्जेक्ट (response.post) में क्यों रखा है?
जोथम

@ जोथम अच्छा सवाल ... मुझे नहीं पता कि मैंने उस पर पहले ध्यान क्यों नहीं दिया, लेकिन इसका कोई कारण नहीं है कि यह response.postअधिक तार्किक होना चाहिए request.post। मैंने पोस्ट अपडेट की।
महन

83

यह क्लीनर होगा यदि आप अपने डेटा को JSON में एनकोड करते हैं , तो इसे Node.js. पर भेजें

function (req, res) {
    if (req.method == 'POST') {
        var jsonString = '';

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

        req.on('end', function () {
            console.log(JSON.parse(jsonString));
        });
    }
}

1
इसी से मेरा काम बना है। अन्य समाधानों से पता चलता है कि एक स्ट्रिंग लौटा है जो JSON जैसा दिखता है लेकिन पार्स नहीं किया गया था। इसके बजाय qs.parse(), JSON.parse()शरीर को प्रयोग करने योग्य वस्तु में बदल दिया। उदाहरण: var post = JSON.parse(body);इसके बाद डेटा तक पहुंचें post.fieldname। (कहानी का नैतिक, अगर आप जो देख रहे हैं उसके बारे में उलझन में हैं, तो मत भूलना typeof!)
wmassingham

12
ठीक है कि आप जानते हैं कि आप JSON.parse फ़ंक्शन को अवश्य पकड़ें क्योंकि अगर मैं आपके आवेदन को दुर्घटनाग्रस्त करना चाहता हूं तो केवल कच्चे टेक्स्ट के साथ एक निकाय भेजें।
इकोरिज़ो

आपको request.setEncodingइस काम को सही तरीके से करने के लिए उपयोग करना चाहिए अन्यथा यह गैर-एएससीआई पात्रों को ठीक से संभाल नहीं सकता है।
फरीद नूरी नेष्ट

37

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

function handler(req, res) {
    var POST = {};
    if (req.method == 'POST') {
        req.on('data', function(data) {
            data = data.toString();
            data = data.split('&');
            for (var i = 0; i < data.length; i++) {
                var _data = data[i].split("=");
                POST[_data[0]] = _data[1];
            }
            console.log(POST);
        })
    }
}

अंत में इस अजीब समस्या के लिए एक पूर्ण काम कर रहे समाधान .. पिछले जवाब से यह समझने में बहुत मदद मिली कि कॉलबैक शुरू होने पर अनुरोध के अंदर कोई डेटा क्यों नहीं था .. बहुत धन्यवाद!
luis-br

3
1) यह उत्तर मानता है कि डेटा एक स्ट्रिंग है। एक सामान्य मामले में खराब धारणा। 2) यह उत्तर मानता है कि डेटा एक चंक में आता है। अन्यथा, '=' से विभाजित होने से अप्रत्याशित परिणाम मिलेगा। एक सामान्य मामले में खराब धारणा।
कॉन्स्टेंटिन

@Konstantin वास्तव में यह उत्तर मानता है कि डेटा एक बफर है। इसकी जांच करें। stackoverflow.com/questions/14551194/… यह भी। millermedeiros.github.io/mdoc/examples/node_api/doc/…
Shawn Whinnery

16

आप उपयोग कर सकते हैं body-parser, Node.js बॉडी पार्सिंग मिडलवेयर।

पहला भार body-parser

$ npm install body-parser --save

कुछ उदाहरण कोड

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

var app = express()

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


app.use(function (req, res) {
  var post_data = req.body;
  console.log(post_data);
})

अधिक प्रलेखन यहाँ पाया जा सकता है



9

यदि आप नोड-दुर्जेय का उपयोग करते हैं तो आप इसे कैसे कर सकते हैं :

var formidable = require("formidable");

var form = new formidable.IncomingForm();
form.parse(request, function (err, fields) {
    console.log(fields.parameter1);
    console.log(fields.parameter2);
    // ...
});

मुझे पथ के साथ कोई समस्या आ रही है, जब मैं फ़ाइल को lwip.open (पथ या पथ + नाम) से अभिगम करने के लिए पथ या पथ + नाम का उपयोग करने का प्रयास करता हूं तो मुझे एक त्रुटि रहित छवि मिल रही है।
Lion789

7

यदि आप शुद्ध Node.js का उपयोग करना पसंद करते हैं तो आप POST डेटा को निकाल सकते हैं जैसे कि नीचे दिखाया गया है:

// Dependencies
const StringDecoder = require('string_decoder').StringDecoder;
const http = require('http');

// Instantiate the HTTP server.
const httpServer = http.createServer((request, response) => {
  // Get the payload, if any.
  const decoder = new StringDecoder('utf-8');
  let payload = '';

  request.on('data', (data) => {
    payload += decoder.write(data);
  });

  request.on('end', () => {
    payload += decoder.end();

    // Parse payload to object.
    payload = JSON.parse(payload);

    // Do smoething with the payload....
  });
};

// Start the HTTP server.
const port = 3000;
httpServer.listen(port, () => {
  console.log(`The server is listening on port ${port}`);
});


6

1) 'body-parser'npm से स्थापित करें ।

2) फिर अपने app.ts में

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

3) फिर आपको लिखने की आवश्यकता है

app.use(bodyParser.json())

में app.ts मॉड्यूल

4) ध्यान रखें कि आप शामिल हैं

app.use(bodyParser.json())

शीर्ष या किसी भी मॉड्यूल घोषणा से पहले।

उदाहरण के लिए:

app.use(bodyParser.json())
app.use('/user',user);

5) फिर उपयोग करें

var postdata = req.body;

5

यदि आप dataकॉलबैक के साथ अपने डेटा को एक साथ नहीं रखना चाहते हैं तो आप हमेशा readableकॉलबैक का उपयोग कर सकते हैं :

// Read Body when Available
request.on("readable", function(){
  request.body = '';
  while (null !== (request.body += request.read())){}
});

// Do something with it
request.on("end", function(){
  request.body //-> POST Parameters as String
});

यह दृष्टिकोण आने वाले अनुरोध को संशोधित करता है, लेकिन जैसे ही आप अपनी प्रतिक्रिया समाप्त करते हैं, अनुरोध कचरा एकत्र हो जाएगा, ताकि कोई समस्या न हो।

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


इसे करने का सुविधाजनक तरीका है, लेकिन आप "शरीर के आकार को पहले कैसे जांचते हैं" इस तरह से दुर्भावनापूर्ण अनुरोध द्वारा मूर्ख नहीं बनाया जा सकता है?
doug65536 2:11

requestएक सामान्य नोड.जेएस स्ट्रीम है, इसलिए आप request.headersशरीर की लंबाई की जांच कर सकते हैं और यदि आवश्यक हो तो अनुरोध को रद्द कर सकते हैं।
थॉमस फनकौशर

1
@ThomasFankhauser शीर्ष लेख में शरीर की लंबाई सही मान या वर्तमान भी नहीं हो सकती है। इसे करने का सही तरीका है, जैसे ही शरीर आता है और आप इसे बफ़र कर रहे हैं, आप यह सुनिश्चित करने के लिए आकार की जांच करते हैं कि यह सीमा को पार नहीं करता है।
फरीद नूरी नेष्ट

4

इसे करने के कई तरीके हैं। हालाँकि, मुझे पता है कि बॉडी-पार्सर के साथ Express.js लाइब्रेरी का उपयोग करने का सबसे तेज़ तरीका है।

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

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

app.post("/pathpostdataissentto", function(request, response) {
  console.log(request.body);
  //Or
  console.log(request.body.fieldName);
});

app.listen(8080);

यह स्ट्रिंग्स के लिए काम कर सकता है, लेकिन मैं bodyParser.urlencoded को bodyParser.json में बदल दूंगा, अगर इसके बजाय POST डेटा में JSON सरणी है।

अधिक जानकारी: http://www.kompulsa.com/how-to-accept-and-parse-post-requests-in-node-js/


4

आपको POSTचंक्स का उपयोग करके डेटा प्राप्त करना होगाrequest.on('data', function(chunk) {...})

const http = require('http');

http.createServer((req, res) => {
    if (req.method == 'POST') {
        whole = ''
        req.on('data', (chunk) => {
            # consider adding size limit here
            whole += chunk.toString()
        })

        req.on('end', () => {
            console.log(whole)
            res.writeHead(200, 'OK', {'Content-Type': 'text/html'})
            res.end('Data received.')
        })
    }
}).listen(8080)

आपको संकेतित स्थिति में आकार सीमा जोड़ने पर विचार करना चाहिए जैसा कि सुझाव दिया गया है


क्या यह अधिक, धीमी गति से लोरिस हमले के लिए अतिसंवेदनशील है?

Nodejs धीमी लोरिस की तुलना में कम संवेदनशील है, उदाहरण के लिए, php - क्योंकि यह हर http कनेक्शन के आसपास एक बड़े सत्र ऑब्जेक्ट का निर्माण नहीं करता है। हालाँकि, ऐसा प्रतीत होता है कि यह कोड अभी भी धीमी-लोरिस भेद्यता का परिचय दे सकता है। इसे setTimeoutउस निश्चित अवधि के बाद कनेक्शन समाप्त होने से रोका जा सकता है , अगर उस विंडो के भीतर पूर्ण अनुरोध प्राप्त नहीं हुआ है।
गेरशोम


3

यदि आप एक्सप्रेस .js का उपयोग कर रहे हैं , इससे पहले कि आप req.body तक पहुँच सकें, आपको मिडलवेयर बॉडीपेयर जोड़ना होगा:

app.use(express.bodyParser());

तो आप के लिए पूछ सकते हैं

req.body.user

अधिकांश मिडलवेयर (जैसे बॉडीपेयर) को अब एक्सप्रेस के साथ नहीं जोड़ा जाता है और इसे अलग से स्थापित किया जाना चाहिए। अधिक वर्तमान उत्तर के लिए @ nikodean2 ऊपर से जवाब देखें
जेफ कोलियर

app.use (bodyParser ()); काम करता है लेकिन मुझे लाल त्रुटि संदेश निंदा दे रहा है
क्रिस Allinson

2

और यदि आप एक्सप्रेस की तरह पूरे ढांचे का उपयोग नहीं करना चाहते हैं, लेकिन आपको अपलोड सहित विभिन्न प्रकार के प्रपत्रों की आवश्यकता है, तो औपचारिक रूप से एक अच्छा विकल्प हो सकता है।

यह Node.js मॉड्यूल में सूचीबद्ध है


1

मुझे एक वीडियो मिला जिसमें बताया गया है कि इसे कैसे प्राप्त किया जा सकता है: https://www.youtube.com/watch?v=nuw48-u3Yrg

यह डिफॉल्ट "http" मॉड्यूल का उपयोग "क्वेरिस्ट्रिंग" और "स्ट्रिंगबिल्डर" मॉड्यूल के साथ करता है। आवेदन एक वेब पेज से दो नंबर (दो टेक्स्टबॉक्स का उपयोग करके) लेता है और सबमिट करने पर, उन दोनों का रिटर्न (टेक्स्टबॉक्स में मूल्यों को बनाए रखने के साथ) देता है। यह सबसे अच्छा उदाहरण है जो मुझे कहीं और मिल सकता है।

संबंधित स्रोत कोड:

var http = require("http");
var qs = require("querystring");
var StringBuilder = require("stringbuilder");

var port = 9000;

function getCalcHtml(req, resp, data) {
    var sb = new StringBuilder({ newline: "\r\n" });
    sb.appendLine("<html>");
    sb.appendLine(" <body>");
    sb.appendLine("     <form method='post'>");
    sb.appendLine("         <table>");
    sb.appendLine("             <tr>");
    sb.appendLine("                 <td>Enter First No: </td>");

    if (data && data.txtFirstNo) {
        sb.appendLine("                 <td><input type='text' id='txtFirstNo' name='txtFirstNo' value='{0}'/></td>", data.txtFirstNo);
    }
    else {
        sb.appendLine("                 <td><input type='text' id='txtFirstNo' name='txtFirstNo' /></td>");
    }

    sb.appendLine("             </tr>");
    sb.appendLine("             <tr>");
    sb.appendLine("                 <td>Enter Second No: </td>");

    if (data && data.txtSecondNo) {
        sb.appendLine("                 <td><input type='text' id='txtSecondNo' name='txtSecondNo' value='{0}'/></td>", data.txtSecondNo);
    }
    else {
        sb.appendLine("                 <td><input type='text' id='txtSecondNo' name='txtSecondNo' /></td>");
    }

    sb.appendLine("             </tr>");
    sb.appendLine("             <tr>");
    sb.appendLine("                 <td><input type='submit' value='Calculate' /></td>");
    sb.appendLine("             </tr>");

    if (data && data.txtFirstNo && data.txtSecondNo) {
        var sum = parseInt(data.txtFirstNo) + parseInt(data.txtSecondNo);
        sb.appendLine("             <tr>");
        sb.appendLine("                 <td>Sum: {0}</td>", sum);
        sb.appendLine("             </tr>");
    }

    sb.appendLine("         </table>");
    sb.appendLine("     </form>")
    sb.appendLine(" </body>");
    sb.appendLine("</html>");
    sb.build(function (err, result) {
        resp.write(result);
        resp.end();
    });
}

function getCalcForm(req, resp, data) {
    resp.writeHead(200, { "Content-Type": "text/html" });
    getCalcHtml(req, resp, data);
}

function getHome(req, resp) {
    resp.writeHead(200, { "Content-Type": "text/html" });
    resp.write("<html><html><head><title>Home</title></head><body>Want to some calculation? Click <a href='/calc'>here</a></body></html>");
    resp.end();
}

function get404(req, resp) {
    resp.writeHead(404, "Resource Not Found", { "Content-Type": "text/html" });
    resp.write("<html><html><head><title>404</title></head><body>404: Resource not found. Go to <a href='/'>Home</a></body></html>");
    resp.end();
}

function get405(req, resp) {
    resp.writeHead(405, "Method not supported", { "Content-Type": "text/html" });
    resp.write("<html><html><head><title>405</title></head><body>405: Method not supported</body></html>");
    resp.end();
}

http.createServer(function (req, resp) {
    switch (req.method) {
        case "GET":
            if (req.url === "/") {
                getHome(req, resp);
            }
            else if (req.url === "/calc") {
                getCalcForm(req, resp);
            }
            else {
                get404(req, resp);
            }
            break;
        case "POST":
            if (req.url === "/calc") {
                var reqBody = '';
                req.on('data', function (data) {
                    reqBody += data;
                    if (reqBody.length > 1e7) { //10MB
                        resp.writeHead(413, 'Request Entity Too Large', { 'Content-Type': 'text/html' });
                        resp.end('<!doctype html><html><head><title>413</title></head><body>413: Request Entity Too Large</body></html>');
                    }
                });
                req.on('end', function () {
                    var formData = qs.parse(reqBody);
                    getCalcForm(req, resp, formData);
                });
            }
            else {
                get404(req, resp);
            }
            break;
        default:
            get405(req, resp);
            break;
    }
}).listen(port);

1

ओवरहेड एन्कोडिंग के बिना कच्चे बाइनरी POST अपलोड का उपयोग करने वालों के लिए आप उपयोग कर सकते हैं:

ग्राहक:

var xhr = new XMLHttpRequest();
xhr.open("POST", "/api/upload", true);
var blob = new Uint8Array([65,72,79,74]); // or e.g. recorder.getBlob()
xhr.send(blob);

सर्वर:

var express = require('express');
var router = express.Router();
var fs = require('fs');

router.use (function(req, res, next) {
  var data='';
  req.setEncoding('binary');
  req.on('data', function(chunk) {
    data += chunk;
  });

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

router.post('/api/upload', function(req, res, next) {
  fs.writeFile("binaryFile.png", req.body, 'binary', function(err) {
    res.send("Binary POST successful!");
  });
});

1

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

import express from 'express'

const app = express()

app.use(express.json())

app.post('/thing', (req, res) => {
  console.log(req.body) // <-- this will access the body of the post
  res.sendStatus(200)
})

यह कोड उदाहरण ES6 एक्सप्रेस 4.16.x के साथ है


0

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

1: nmp install multiparty

2: आयात मल्टीपार्टी। जैसाvar multiparty = require('multiparty');

3: `

if(req.method ==='POST'){
   var form = new multiparty.Form();
   form.parse(req, function(err, fields, files) {
      console.log(fields['userfile1'][0]);
    });
    }

4: और HTML FORM IS है।

<form method=POST enctype=multipart/form-data>
<input type=text name=userfile1><br>
<input type=submit>
</form>

मुझे उम्मीद है कि यह आपके लिए काम करेगा। धन्यवाद।


0

सीमा POST आकार अपने नोड एप्लिकेशन बाढ़ से बचें। एक महान कच्चा-शरीर मॉड्यूल है, जो एक्सप्रेस और कनेक्ट दोनों के लिए उपयुक्त है, जो आकार और लंबाई के अनुसार अनुरोध को सीमित करने में आपकी सहायता कर सकता है।


0

यदि इसमें फ़ाइल अपलोड शामिल है, तो ब्राउज़र आमतौर पर इसे "multipart/form-data"सामग्री-प्रकार के रूप में भेजता है । आप ऐसे मामलों में इसका इस्तेमाल कर सकते हैं

var multipart = require('multipart');
multipart.parse(req)

संदर्भ १

संदर्भ २


0

इन जैसे फार्म फील्ड पर

   <input type="text" name="user[name]" value="MyName">
   <input type="text" name="user[email]" value="myemail@somewherefarfar.com">

उपरोक्त कुछ उत्तर विफल हो जाएंगे क्योंकि वे केवल फ्लैट डेटा का समर्थन करते हैं।

अब मैं केसी चू जवाब उपयोग कर रहा हूँ के लिए लेकिन साथ "qs" के बदले "क्वेरी स्ट्रिंग" मॉड्यूल। यह मॉड्यूल "बॉडी-पार्सर" भी उपयोग करता है। इसलिए यदि आप नेस्टेड डेटा चाहते हैं तो आपको qs इंस्टॉल करना होगा।

npm install qs --save

फिर पहली पंक्ति को बदलें जैसे:

//var qs = require('querystring');
var qs = require('qs'); 

function (request, response) {
    if (request.method == 'POST') {
        var body = '';

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

            // Too much POST data, kill the connection!
            // 1e6 === 1 * Math.pow(10, 6) === 1 * 1000000 ~~~ 1MB
            if (body.length > 1e6)
                request.connection.destroy();
        });

        request.on('end', function () {
            var post = qs.parse(body);
            console.log(post.user.name); // should work
            // use post['blah'], etc.
        });
    }
}

0

आप "अनुरोध - सरलीकृत HTTP क्लाइंट" और जावास्क्रिप्ट प्रॉमिस का उपयोग करके POST अनुरोध की प्रतिक्रिया आसानी से भेज और प्राप्त कर सकते हैं।

var request = require('request');

function getData() {
    var options = {
        url: 'https://example.com',
        headers: {
            'Content-Type': 'application/json'
        }
    };

    return new Promise(function (resolve, reject) {
        var responseData;
        var req = request.post(options, (err, res, body) => {
            if (err) {
                console.log(err);
                reject(err);
            } else {
                console.log("Responce Data", JSON.parse(body));
                responseData = body;
                resolve(responseData);
            }
        });
    });
}

0

यदि आप चाहते हैं कि फॉर्म डेटा req.body में उपलब्ध हो तो आपको बॉडीपेयर () का उपयोग करना होगा। body-parser आपके अनुरोध को पार्स करता है और इसे एक ऐसे प्रारूप में परिवर्तित करता है जिससे आप आसानी से प्रासंगिक जानकारी निकाल सकते हैं जिसकी आपको आवश्यकता हो सकती है।

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

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

............................................................।

var loginDetails = {

username : request.body.username,

password : request.body.password

};

0

MIDDLEWARE के बिना एक लाइनर
यदि आप निम्नलिखित डेटा पोस्ट करते हैं,
'name':'ABC'
तो आप निम्नलिखित एक लाइनर का उपयोग करके इसे पार्स कर सकते हैं,

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