POST क्वेरी पैरामीटर कैसे प्राप्त करें?


768

यहाँ मेरा सरल रूप है:

<form id="loginformA" action="userlogin" method="post">
    <div>
        <label for="email">Email: </label>
        <input type="text" id="email" name="email"></input>
    </div>
<input type="submit" value="Submit"></input>
</form>

यहाँ मेरा Express.js /Node.js कोड है:

app.post('/userlogin', function(sReq, sRes){    
    var email = sReq.query.email.;   
}

मैंने कोशिश की sReq.query.emailया sReq.query['email']या sReq.params['email'], आदि उनमें से कोई भी काम नहीं करता है। वे सभी लौट आए undefined

जब मैं गेट कॉल में बदलता हूं, तो यह काम करता है, इसलिए .. कोई विचार?


33
सुरक्षा : bodyParser()यहाँ जवाब से उपयोग करने वाले हर व्यक्ति को नीचे दिए गए @SeanLynch के
FelipeAls

बॉडी-पार्सर मॉड्यूल का उपयोग करें । यहाँ शरीर-पार्सर के लिए
drorw

जवाबों:


1250

हालात है बदल फिर से शुरू करने एक बार एक्सप्रेस 4.16.0 , अब आप उपयोग कर सकते हैं express.json()और express.urlencoded()बस में की तरह एक्सप्रेस 3.0

यह था विभिन्न शुरू कर 4.15 करने के लिए एक्सप्रेस 4.0 :

$ npm install --save body-parser

और फिर:

var bodyParser = require('body-parser')
app.use( bodyParser.json() );       // to support JSON-encoded bodies
app.use(bodyParser.urlencoded({     // to support URL-encoded bodies
  extended: true
})); 

बाकी एक्सप्रेस 3.0 में है :

सबसे पहले आपको शरीर के पोस्ट डेटा को पार्स करने के लिए कुछ मिडलवेयर को जोड़ना होगा।

कोड की निम्नलिखित पंक्तियों में से एक या दोनों को जोड़ें:

app.use(express.json());       // to support JSON-encoded bodies
app.use(express.urlencoded()); // to support URL-encoded bodies

फिर, अपने हैंडलर में, req.bodyऑब्जेक्ट का उपयोग करें :

// assuming POST: name=foo&color=red            <-- URL encoding
//
// or       POST: {"name":"foo","color":"red"}  <-- JSON encoding

app.post('/test-page', function(req, res) {
    var name = req.body.name,
        color = req.body.color;
    // ...
});

ध्यान दें कि उपयोग की express.bodyParser()अनुशंसा नहीं की जाती है।

app.use(express.bodyParser());

...के बराबर है:

app.use(express.json());
app.use(express.urlencoded());
app.use(express.multipart());

सुरक्षा चिंताओं के साथ मौजूद हैं express.multipart(), और इसलिए यह विशिष्ट एन्कोडिंग प्रकार (ओं) के लिए स्पष्ट रूप से समर्थन जोड़ना बेहतर है, जिनकी आपको आवश्यकता है। यदि आपको मल्टीपार्ट एन्कोडिंग की आवश्यकता है (उदाहरण के लिए अपलोडिंग फ़ाइलों का समर्थन करने के लिए) तो आपको इसे पढ़ना चाहिए ।


76
यदि यह उत्तर सही काम नहीं कर रहा है, तो सुनिश्चित करें कि आपके पास content-typeहेडर सेट है, उदाहरण के लिए:curl -d '{"good_food":["pizza"]}' -H 'content-type:application/json' "http://www.example.com/your_endpoint"
SooDesuNe

6
नाम / मान जोड़े के साथ फॉर्म पोस्ट करने और JSON बॉडी पोस्ट करने में क्या अंतर है? क्या वे दोनों req.body में दिखाई देते हैं?
चॉवी

7
@chovy हाँ, वे करते हैं। bodyParserअमूर्त JSON, URL- एन्कोडेड और डेटा को req.bodyऑब्जेक्ट में गुणा करें ।
कृत्जन

7
इस कोड ने मुझे त्रुटियाँ दीं क्योंकि मिडलवेयर अब एक्सप्रेस के साथ बंडल नहीं है; आपको बॉडी-पार्सर का उपयोग करना होगा: github.com/senchalabs/connect#middleware
araneae

11
एक्सप्रेस 4 का उपयोग करते हुए पढ़ने के लिए, केवल app.use(require('body-parser').json())रेखा पर्याप्त है। और फिर आप req.bodyरूट अनुरोध के भीतर से अपने अनुरोध की बॉडी ऑब्जेक्ट यानी , से json डेटा पढ़ सकते हैं ।
मार्टिन केयरल

90

एक्सप्रेस का उपयोग कर सुरक्षा चिंता।

जबकि अन्य सभी जवाब वर्तमान में उपयोग करने की अनुशंसा express.bodyParser()मिडलवेयर, यह वास्तव में चारों ओर एक आवरण है express.json(), express.urlencoded()और express.multipart()middlewares ( http://expressjs.com/api.html#bodyParser )। फॉर्म अनुरोध निकायों की पार्सिंग express.urlencoded()मिडलवेयर द्वारा की जाती है और यह सब आपके फॉर्म डेटा को उजागर करने की आवश्यकता हैreq.body ऑब्जेक्ट ।

सभी अपलोड की गई फ़ाइलों के लिए अस्थायी फ़ाइलों को कैसे / बनाता है (और कचरा एकत्र नहीं किया जाता है) के साथ एक सुरक्षा चिंता के कारण , अब यह सलाह दी जाती है कि आप रैपर का उपयोग न करें बल्कि इसके बजाय केवल उन बिचौलियों का उपयोग करें जिनकी आपको आवश्यकता है।express.multipart()connect.multipart()express.bodyParser()

नोट: connect.bodyParser()जल्द ही केवल शामिल करने के लिए अपडेट किया जाएगा urlencodedऔर jsonजब कनेक्ट 3.0 जारी किया जाता है (जो एक्सप्रेस विस्तारित होता है)।


तो संक्षेप में, इसके बजाय ...

app.use(express.bodyParser());

...आपको उपयोग करना चाहिए

app.use(express.urlencoded());
app.use(express.json());      // if needed

और अगर / जब आपको मल्टीपार्ट फॉर्म (फाइल अपलोड) को संभालने की आवश्यकता है, तो एक तीसरे पक्ष के पुस्तकालय या मिडलवेयर जैसे मल्टीपार्टी, बसबॉय, डिसर, आदि का उपयोग करें।


प्रश्न के नीचे एक टिप्पणी जोड़ी गई ताकि अधिक लोग आपकी चिंताओं और सलाह को देखें। क्या आपकी राय में एंड्रयू केली ब्लॉग पोस्ट (अभी भी) में विस्तृत अन्य समाधान प्रासंगिक होंगे? (बस दूसरों के लिए पूछ रहे हैं, मेरी जरूरत आंतरिक उपकरणों के लिए विशुद्ध रूप से ^ ^ हैं)
फेलिपएल्स

@ फेलिपएल्स - हां, और मेरा उद्देश्य एंड्रयू की पोस्ट को भी संदर्भित करना था। उन सुझावों में से कोई भी (प्रत्येक की गिरावट को ध्यान में रखते हुए) प्रासंगिक है।
सीन लिंच

इसके अलावा, एक बार कनेक्ट 3.0 को शामिल किए बिना जारी किया गया है multipart()के भाग के रूप bodyParser(), bodyParser()"सुरक्षित" फिर से हो जाता है, लेकिन स्पष्ट रूप से एक तीसरी पार्टी लाइब्रेरी का उपयोग कर बहुखण्डीय समर्थन को सक्षम करने के लिए आप की आवश्यकता होगी।
सीन लिंच

84

नोट : यह उत्तर एक्सप्रेस 2 के लिए है। एक्सप्रेस 3 के लिए यहां देखें ।

यदि आप कनेक्ट / एक्सप्रेस का उपयोग कर रहे हैं, तो आपको bodyParser मिडलवेयर का उपयोग करना चाहिए : यह Expressjs गाइड में वर्णित है ।

// example using express.js:
var express = require('express')
  , app = express.createServer();
app.use(express.bodyParser());
app.post('/', function(req, res){
  var email = req.param('email', null);  // second parameter is default
});

यहाँ मूल कनेक्ट-केवल संस्करण है:

// example using just connect
var connect = require('connect');
var url = require('url');
var qs = require('qs');
var server = connect(
  connect.bodyParser(),
  connect.router(function(app) {
    app.post('/userlogin', function(req, res) {
      // the bodyParser puts the parsed request in req.body.
      var parsedUrl = qs.parse(url.parse(req.url).query);
      var email = parsedUrl.email || req.body.email;;
    });
  })
);

निम्न-स्तरीय लाइब्रेरी के बजाय रेल-स्टाइल पैरामीटर हैंडलिंग ( qs) का उपयोग करके दोनों क्वेरिस्ट्रिंग और बॉडी को पार्स किया जाता है । के साथ दोहराया मापदंडों को पार्स करने के लिए , पैरामीटर को कोष्ठक की आवश्यकता है :। यह नेस्टेड मैप को भी सपोर्ट करता है। HTML फॉर्म सबमिशन को पार्स करने के अलावा, bodyParser JSON अनुरोधों को स्वचालित रूप से पार्स कर सकता है।querystringqsname[]=val1&name[]=val2

संपादित करें : मैंने एक्सप्रेस.जेएस पर पढ़ा और एक्सप्रेस के उपयोगकर्ताओं के लिए अधिक प्राकृतिक होने के लिए मेरे उत्तर को संशोधित किया।


हम्म ठीक है। मैं bodyParser () का प्रयास करें। डॉक्टर का कहना है कि मैं इसे req.query () से प्राप्त कर सकता हूं लेकिन मुझे कुछ नहीं मिला। यह बहुत अजीब है। मुझे कोई समस्या नहीं है।
मुर्विनलाई

3
नहीं, req.query केवल GET परम है। आपको POST डेटा req.body के माध्यम से मिलता है। फ़ंक्शन req.params () उन दोनों को शामिल करता है।
योनारन

एक आवारा क्लिक ने इस उत्तर को गलती से मेरे बिना देख लिया! अब StackOverflow मुझे इसे बदलने नहीं देगा। Esp। के रूप में यह उपयोगी था निराशा होती है ... मैंने आपके अच्छे उत्तरों में से एक को उकेरा है जो मैं स्पष्ट रूप से इसके लिए नहीं देख रहा था। :)
HostileFork का कहना है कि

33

यदि आप बिना मिडलवेयर के पोस्ट की गई क्वेरी बनाना चाहते हैं, तो यह ऐसा करेगा:

app.post("/register/",function(req,res){
    var bodyStr = '';
    req.on("data",function(chunk){
        bodyStr += chunk.toString();
    });
    req.on("end",function(){
        res.send(bodyStr);
    });

});

जो इसे ब्राउजर में भेजेगा

email=emailval&password1=pass1val&password2=pass2val

मिडिलवेयर का उपयोग करना शायद बेहतर है, हालांकि आपको प्रत्येक मार्ग में इसे बार-बार लिखना नहीं है।


3
sooo .... आसान है, उन लोगों के लिए जो जल्दी या बाद में एक पुस्तकालय पर भरोसा नहीं करना चाहते हैं
डैनियल

आप आसानी से अपने खुद के मिडलवेयर का निर्माण कर सकते हैं
maioman

यह एक शानदार उत्तर है लेकिन अतिरिक्त पाठ क्यों है "---------------------------- 359856253150893337905494 सामग्री-विवाद: प्रपत्र-डेटा; नाम = "पूर्णनाम" राम ---------------------------- 359856253150893337905494-- "मुझे यह संख्या नहीं चाहिए।
नवाज

25

एक्सप्रेस 4 उपयोगकर्ताओं के लिए नोट:

यदि आप प्रयास करते हैं और app.use(express.bodyParser());अपने ऐप में डालते हैं , तो आपको अपना एक्सप्रेस सर्वर शुरू करने का प्रयास करते समय निम्न त्रुटि मिलेगी:

त्रुटि: अधिकांश मिडलवेयर (जैसे बॉडीपेयर) अब एक्सप्रेस के साथ बंडल नहीं है और इसे अलग से स्थापित किया जाना चाहिए। कृपया https://github.com/senchalabs/connect#middleware देखें

आपको पैकेज को npm सेbody-parser अलग से स्थापित करना होगा , फिर निम्न का कुछ उपयोग करें (उदाहरण GitHub पृष्ठ से लिया गया ):

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

var app = express();

app.use(bodyParser());

app.use(function (req, res, next) {
  console.log(req.body) // populated!
  next();
})

इस जानकारी के लिए बहुत बहुत धन्यवाद। मेरे शरीर को खींच रहा था ताकि बॉडीपार के उपयोग के नए तरीके से निपटने की कोशिश की जा सके! यह एक बड़ी सफलता थी - वास्तव में सराहना
टॉमी

1
heplp: बॉडी-पार्सर डेप्रिसिएटेड बॉडीपैर: इंडिविजुअल json / urlencoded midwares
मोहम्मद फैजान खान

19

कुछ रूप दिया:

<form action='/somepath' method='post'>
   <input type='text' name='name'></input>
</form>

एक्सप्रेस का उपयोग करना

app.post('/somepath', function(req, res) {

    console.log(JSON.stringify(req.body));

    console.log('req.body.name', req.body['name']);
});

आउटपुट:

{"name":"x","description":"x"}
req.param.name x

6
मेरे लिए काम नहीं किया। app.use (express.bodyParser ()) का उपयोग करने की आवश्यकता है;
cawecoy

@cawecoy बिलकुल यहीं पर, लेकिन एक्सप्रेस। WhoParser () मेरे लिए भी काम नहीं कर रहा है क्योंकि यह हटा दिया गया है
मोहम्मद फैजान खान

@ मोहम्मदफैजानखान यह एक प्रायोगिक कार्य था, मैंने अब एक्सप्रेस का उपयोग नहीं किया, अब मदद नहीं कर सकता। इसे व्यक्त करने के लिए समान कार्यों के लिए Google। अच्छा भाग्यशाली!
cawecoy

16

बैकएंड:

import express from 'express';
import bodyParser from 'body-parser';

const app = express();
app.use(bodyParser.json()); // add a middleware (so that express can parse request.body's json)

app.post('/api/courses', (request, response) => {
  response.json(request.body);
});

फ़्रंट एंड:

fetch("/api/courses", {
  method: 'POST',
  body: JSON.stringify({ hi: 'hello' }), // convert Js object to a string
  headers: new Headers({ "Content-Type": "application/json" }) // add headers
});

15
app.use(express.bodyParser());

फिर app.postअनुरोध के लिए आप पोस्ट मान प्राप्त कर सकते हैं req.body.{post request variable}


आपकी पोस्ट अनुरोध चर यहाँ है, कि सवाल में इनपुट क्षेत्र की आईडी या पूरे फार्म या क्या है?
ईगक्लाउड

2
express.bodyParser () पदावनत है। अपने उत्तर को अपडेट करें
मोहम्मद फैजान खान

15

एक्सप्रेस 4.4.1 के लिए अद्यतन

निम्न में से मिडलवेयर को एक्सप्रेस से हटा दिया जाता है।

  • bodyParser
  • json
  • urlencoded
  • बहुखण्डीय

जब आप मिडलवेयर का उपयोग सीधे करते हैं जैसे आपने एक्सप्रेस 3.0 में किया था। आपको निम्न त्रुटि मिलेगी:

Error: Most middleware (like urlencoded) is no longer bundled with Express and 
must be installed separately.


उन मिडलवेयर का उपयोग करने के लिए, अब आपको npm करने की आवश्यकता है प्रत्येक मिडलवेयर के लिए अलग से ।

चूंकि bodyParser को पदावनत के रूप में चिह्नित किया गया है, इसलिए मैं json, urlencode और multipart parser जैसे दुर्जेय, कनेक्ट-मल्टीपार्टी का उपयोग करके निम्न तरीके सुझाता हूं। (मल्टीपार्ट मिडलवेयर को भी हटा दिया गया है)।

यह भी याद रखें, केवल urlencode + json को परिभाषित करने पर, प्रपत्र डेटा को पार्स नहीं किया जाएगा और req.body अपरिभाषित हो जाएगा। आपको एक मिडलवेयर को मल्टीपार्ट अनुरोध को संभालने की आवश्यकता है।

var urlencode = require('urlencode');
var json = require('json-middleware');
var multipart = require('connect-multiparty');
var multipartMiddleware = multipart();

app.use(json);
app.use(urlencode);
app.use('/url/that/accepts/form-data', multipartMiddleware);

मुझे लगता है कि यह वास्तव में बुरी सुविधा अपडेशन है
मोहम्मद फैजान खान

सिर्फ बॉडी पार्स के लिए मुझे बहुत सारे कोड करने होंगे। हैक क्या है
मोहम्मद फैजान खान

1
मुझे इसे काम करने के लिए "(जैसन-मिडलवेयर ') की आवश्यकता के लिए" .middleware () "जोड़ना पड़ा।
DustinB

8

एक्सप्रेस 4.1 और इसके बाद के संस्करण के लिए

जैसा कि अधिकांश उत्तर एक्सप्रेस, बॉडीपेयर, कनेक्ट का उपयोग कर रहे हैं; जहां मल्टीपार्ट को पदावनत किया जाता है। पोस्ट मल्टीपार्ट ऑब्जेक्ट को आसानी से भेजने का एक सुरक्षित तरीका है।

Connect.multipart () के प्रतिस्थापन के रूप में Multer का उपयोग किया जा सकता है।

पैकेज स्थापित करने के लिए

$ npm install multer

इसे अपने ऐप में लोड करें:

var multer = require('multer');

और फिर, इसे मिडिलवेयर स्टैक के साथ-साथ दूसरे फॉर्म पार्सिंग मिडलवेयर में जोड़ें।

app.use(express.json());
app.use(express.urlencoded());
app.use(multer({ dest: './uploads/' }));

connect.json () एप्लिकेशन / जसन को संभालता है

connect.urlencoded () एप्लिकेशन / x-www-form-urlencoded हैंडल करता है

multer () मल्टीपार्ट / फॉर्म-डेटा को हैंडल करता है


8

मैं इस सटीक समस्या को खोज रहा था। मैं उपरोक्त सभी सलाह का पालन कर रहा था, लेकिन req.body अभी भी एक खाली वस्तु {} वापस कर रहा था। मेरे मामले में, यह कुछ ऐसा ही था जैसा कि HTML गलत है।

अपने फ़ॉर्म के html में, सुनिश्चित करें कि आप 'name'अपने इनपुट टैग में विशेषता का उपयोग करते हैं , न कि केवल 'id'। अन्यथा, कुछ भी पार्स नहीं है।

<input id='foo' type='text' value='1'/>             // req = {}
<input id='foo' type='text' name='foo' value='1' /> // req = {foo:1}

मेरी मूर्खतापूर्ण गलती आपका लाभ है।


यहां भी यही समस्या। लेकिन मैं शुरू से नाम विशेषता का उपयोग कर रहा था। आइए देखें कि समस्या क्या है।
सैफ अल फलाह

6

आप app.use (express.bodyParser ()) का उपयोग नहीं करते हैं । BodyParser json + urlencoded + mulitpart का एक संघ है। आप इसका उपयोग नहीं करते क्योंकि कनेक्ट 3.0 में मल्टीपार्ट हटा दिया जाएगा।

इसे हल करने के लिए, आप यह कर सकते हैं:

app.use(express.json());
app.use(express.urlencoded());

यह बहुत महत्वपूर्ण है कि app.use (app.router) का उपयोग जन्स और urlencoded के बाद किया जाना चाहिए, अन्यथा यह काम नहीं करता है!


4

अनुरोध स्ट्रीमिंग ने मेरे लिए काम किया

req.on('end', function() {
    var paramstring = postdata.split("&");
});

var postdata = "";
req.on('data', function(postdataChunk){
    postdata += postdataChunk;
});

1
postdata.split("&")कोर मॉड्यूल को लोड करने querystring = require('querystring')और फिर आपके postdataसाथ पार्स करने से बेहतर होगा querystring.parse(postdata);
जॉन सेलर्स

4

मैं POST और GET दोनों अनुरोधों के लिए निम्नलिखित कोड का उपयोग करके सभी पैरामीटर पा सकता हूं ।

var express = require('express');
var app = express();
const util = require('util');
app.post('/', function (req, res) {
    console.log("Got a POST request for the homepage");
    res.send(util.inspect(req.query,false,null));
})

क्या आप एक्सप्रेस के अपने संस्करण के साथ उत्तर को अपडेट करने का मन बनाते हैं?
lfender6445

3

एक्सप्रेस संस्करण 4.16 पर लिखा गया

राउटर फ़ंक्शन के अंदर आप req.bodyपोस्ट चर का उपयोग करने के लिए संपत्ति का उपयोग कर सकते हैं । उदाहरण के लिए यदि यह POSTआपके फॉर्म का मार्ग था, तो यह आपके द्वारा भेजे गए इनपुट को वापस भेज देगा:

function(req,res){
      res.send(req.body);

      //req.body.email would correspond with the HTML <input name="email"/>
}

उन लोगों के लिए PS जो PHP से परिचित हैं: PHP के $_GETचर का उपयोग req.queryकरने के लिए और PHP के चर का उपयोग करने के लिए $_POSTहम req.bodyNode.se.s.


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

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

app.get('/',function(req,res){
  res.sendfile("index.html");
});
app.post('/login',function(req,res){
  var user_name=req.body.user;
  var password=req.body.password;
  console.log("User name = "+user_name+", password is "+password);
  res.end("yes");
});
app.listen(3000,function(){
  console.log("Started on PORT 3000");
})

1

पोस्ट पैरामीटर्स को निम्न प्रकार से प्राप्त किया जा सकता है:

app.post('/api/v1/test',Testfunction);
http.createServer(app).listen(port, function(){
    console.log("Express server listening on port " + port)
});

function Testfunction(request,response,next) {
   console.log(request.param("val1"));
   response.send('HI');
}

1
क्या आपको एहसास है कि यह काम नहीं करेगा paramGET अनुरोधों के लिए उपयोग किया जाता है .. पोस्ट नहीं और आपके उदाहरण में विवरणों की कमी है, नए कामर्स के लिए बहुत भ्रामक है। और उसके शीर्ष पर request.paramवास्तव में पदावनत है, इसलिए आपके उदाहरण इतने सारे स्तरों पर गलत हैं।
vdegenne

0

आप req.query.postगलत तरीके से req.query.postकाम कर रहे हैं method=get, बॉडी-पार्सर केmethod=post साथ काम कर रहे हैं ।

बस पाने के लिए पोस्ट बदलकर इसे आज़माएं :

<form id="loginformA" action="userlogin" method="get">
<div>
    <label for="email">Email: </label>
    <input type="text" id="email" name="email"></input>
</div>
<input type="submit" value="Submit"></input>  
</form>

और एक्सप्रेस कोड में 'app.get' का उपयोग करें


0

एक्सप्रेस-फाइलअप लोड पैकेज का उपयोग करें :

var app = require('express')();
var http = require('http').Server(app);
const fileUpload = require('express-fileupload')

app.use(fileUpload());

app.post('/', function(req, res) {
  var email = req.body.email;
  res.send('<h1>Email :</h1> '+email);
});

http.listen(3000, function(){
  console.log('Running Port:3000');
});
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.