Node.js और Express का उपयोग करते समय POST करने पर अनुरोध निकाय तक कैसे पहुँचें?


175

मेरे पास निम्नलिखित Node.js कोड है:

var express = require('express');
var app = express.createServer(express.logger());
app.use(express.bodyParser());

app.post('/', function(request, response) {
    response.write(request.body.user);
    response.end();
});

अब अगर मैं कुछ इस तरह पोस्ट करता हूं:

curl -d user=Someone -H Accept:application/json --url http://localhost:5000

मुझे Someoneउम्मीद के मुताबिक मिलता है। अब, क्या होगा अगर मैं पूर्ण अनुरोध निकाय प्राप्त करना चाहता हूं? मैंने करने की कोशिश की, response.write(request.body)लेकिन Node.js ने अपवाद को यह कहते हुए फेंक दिया कि " पहला तर्क एक स्ट्रिंग या बफर होना चाहिए " फिर एक अपवाद के साथ एक "अनंत लूप" में जाता है जो कहता है कि " हेडर सेट नहीं किए जा सकते हैं क्योंकि उन्हें भेजे जाने के बाद "। यह सच भी है अगर मैंने किया var reqBody = request.body;और फिर लेखन response.write(reqBody)

यहाँ क्या समस्या है?

इसके अलावा, क्या मैं बिना उपयोग किए सिर्फ कच्चा अनुरोध प्राप्त कर सकता हूं express.bodyParser()?


ऐसा लगता है कि कुछ के साथ है response.write(reqBody); जब मैं response.send(reqBody)चीजों का उपयोग कर रहा हूं, ठीक काम कर रहा हूं ... और हां, मैं इसके response.endबाद उपयोग करता हूं response.write
TheBlueSky

जवाबों:


161

एक्सप्रेस 4.0 और इसके बाद के संस्करण:

$ npm install --save body-parser

और फिर अपने नोड ऐप में:

const bodyParser = require('body-parser');
app.use(bodyParser);

एक्सप्रेस 3.0 और नीचे:

अपने cURL कॉल में इसे पास करने का प्रयास करें:

--header "Content-Type: application/json"

और सुनिश्चित करें कि आपका डेटा JSON प्रारूप में है:

{"user":"someone"}

इसके अलावा, आप निम्न उदाहरण में ऑब्जेक्ट के अंदर डेटा देखने के लिए अपने नोड .js कोड में कंसोल.dir का उपयोग कर सकते हैं:

var express = require('express');
var app = express.createServer();

app.use(express.bodyParser());

app.post('/', function(req, res){
    console.dir(req.body);
    res.send("test");
}); 

app.listen(3000);

यह अन्य प्रश्न भी मदद कर सकता है: एक्सप्रेस नोड में JSON कैसे प्राप्त करें। POST अनुरोध?

यदि आप bodyParser का उपयोग नहीं करना चाहते हैं तो यह अन्य प्रश्न देखें: https://stackoverflow.com/a/9920700/446681


मैंने उपयोग करने की कोशिश की, curl -d {"user":"Someone"} -H "Content-Type: application/json" --url http://localhost:5000लेकिन यह मुझे " अप्रत्याशित टोकन यू " त्रुटि दे रहा था , इसीलिए मैंने अपने मूल पोस्ट में उल्लिखित कॉल पर स्विच किया।
TheBlueSky

मैं इसे लिंक के कारण जवाब के रूप में चिह्नित कर रहा हूं stackoverflow.com/a/9920700/446681
TheBlueSky

40
express.bodyParser()एक्सप्रेस 4.x में पदावनत किया गया है। इसके बजाय npmjs.org/package/body-parser का उपयोग करें ।
ल्यूक

@ TheBlueSky का कारण आपको "अनपेक्षित टोकन यू" मिला क्योंकि शेल आपके दोहरे उद्धरणों का उपभोग करता था। यदि आप ऐसा ही करते हैं तो वही होता है echo any"thing"। आपके द्वारा पोस्ट किया जा रहा डेटा ऐसा होने से रोकने के लिए उद्धरण चिह्नों के भीतर होना चाहिए।
टॉम फेनच

11
4.16.0 या इसके बाद के संस्करण से app.use () में इस तरह से express.json () का उपयोग करना संभव है => app.use (express.json ());
मित्रो

187

एक्सप्रेस v4.16 से शुरू करने के लिए किसी अतिरिक्त मॉड्यूल की आवश्यकता नहीं है, बस अंतर्निहित JSON मिडलवेयर का उपयोग करें :

app.use(express.json())

ऐशे ही:

const express = require('express')

app.use(express.json())    // <==== parse request body as JSON

app.listen(8080)

app.post('/test', (req, res) => {
  res.json({requestBody: req.body})  // <==== req.body will be a parsed JSON object
})

नोट - body-parser, जिस पर यह निर्भर करता है, पहले से ही एक्सप्रेस के साथ शामिल है

इसके अलावा हेडर भेजने के लिए मत भूलना Content-Type: application/json


14
धन्यवाद, यह 4.16+ के लिए सबसे अच्छा जवाब है। कोई अन्य निर्भरता और एक आकर्षण की तरह काम करता है!
कोडप्लेब

1
सबसे अच्छा / एकमात्र समाधान मैं पा सकता हूं कि शरीर-पार्सर की आवश्यकता नहीं है
मोट ज़ार्ट

41

एक्सप्रेस 4 के अनुसार, निम्न कोड चाल करता है। ध्यान दें कि आपको body-parserउपयोग करके इंस्टॉल करना होगा npm

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


app.listen(8888);

app.post('/update', function(req, res) {
    console.log(req.body); // the posted data
});

29
पार्सिंग जसन निकायों के लिए निम्न पंक्ति को जोड़ना आवश्यक हैapp.use(bodyParser.json())
कैमिलो सिल्वा

1
@ cml.co तो ऐसा कोई कारण है app.use(bodyParser.urlencoded({ extended: true })है भी आवश्यक है? मैं अनुरोध में JSON के रूप में एक जटिल दस्तावेज पोस्ट कर रहा हूं, और extended: falseकाम नहीं किया। केवल जब मैंने इसे सही पर सेट किया है, तो अनुरोध सही ढंग से पार्स किया गया है।
वेब यूजर

3
सिर्फ एक नोट। NWSJS और एक्सप्रेस के साथ AWS लिनक्स सर्वर सेटअप पर json डेटा प्राप्त करने app.use(bodyParser.urlencoded({ extended: true }));और उपयोग करने के लिए था app.use(bodyParser.json())
डेविड

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

var port = 9000;

app.post('/post/data', function(req, res) {
    console.log('receiving data...');
    console.log('body is ',req.body);
    res.send(req.body);
});

// start the server
app.listen(port);
console.log('Server started! At http://localhost:' + port);

इससे आपको मदद मिलेगी। मुझे लगता है कि आप जसन में शरीर भेज रहे हैं।


मैं हमेशा bodyParser.json () बिट x_x धन्यवाद जोड़ना भूल जाता हूँ!
जॉनी असमर

14

2019 के लिए, आपको इंस्टॉल करने की आवश्यकता नहीं है body-parser

आप उपयोग कर सकते हैं:

var express = require('express');
var app = express();
app.use(express.json())
app.use(express.urlencoded({extended: true}))
app.listen(8888);
app.post('/update', function(req, res) {
    console.log(req.body); // the posted data
});

8

इस के बिना प्राप्त किया जा सकता body-parserनिर्भरता के रूप में अच्छी तरह से, बात सुनो request:dataऔर request:endऔर अनुरोध के अंत पर प्रतिक्रिया वापस, कोड नमूना नीचे देखें। रेफरी: https://nodejs.org/en/docs/guides/anatomy-of-an-http-transaction/#request-body

var express = require('express');
var app = express.createServer(express.logger());

app.post('/', function(request, response) {

    // push the data to body
    var body = [];
    request.on('data', (chunk) => {
      body.push(chunk);
    }).on('end', () => {
      // on end of data, perform necessary action
      body = Buffer.concat(body).toString();
      response.write(request.body.user);
      response.end();
    });
});

3

इसे इस्तेमाल करे:

response.write(JSON.stringify(request.body));

यह bodyParserआपके लिए बनाई गई वस्तु को ले जाएगा और इसे वापस एक स्ट्रिंग में बदल देगा और इसे प्रतिक्रिया पर लिख देगा। यदि आप सटीक अनुरोध निकाय चाहते हैं (एक ही व्हाट्सएप, आदि के साथ), तो आपको पहले अनुरोध से जुड़े श्रोताओं dataऔर endश्रोताओं की जरूरत पड़ेगी और चंक द्वारा स्ट्रिंग चंक का निर्माण करना होगा जैसा कि आप कनेक्ट से जौन पार्सिंग सोर्स कोड में देख सकते हैं ।


1

जब आप "करने की कोशिश" करने का दावा करते हैं, तो आपने कोड में वही लिखा है जो "अपेक्षित रूप से" काम करता है जब आप इसे कर्ल के साथ आमंत्रित करते हैं।

आपको जो त्रुटि मिल रही है, वह आपके द्वारा दिखाए गए किसी भी कोड से संबंधित प्रतीत नहीं होती है।

यदि आप कच्चा अनुरोध प्राप्त करना चाहते हैं, तो ईवेंट्स और इवेंट्स के requestलिए हैंडलर सेट करें (और निश्चित रूप से, किसी भी इनवोकेशन को हटा दें )। ध्यान दें कि घटनाएँ विखंडन में घटित होंगी, और जब तक कि आप इस घटना के लिए एन्कोडिंग सेट नहीं करते हैं, उन विखंडों में बफ़र होंगे, तार नहीं।dataendexpress.bodyParser()datadata


यह एक कॉपी-पेस्ट गलती थी; मेरा मतलब था request.bodyऔर नहीं request.body.user, और मैंने इसे अब ठीक कर दिया। वैसे, var reqBody = request.body;था और अभी भी सही है और जब आप यह कोशिश करते हैं तो आपको वह त्रुटि मिलेगी जो मुझे मिल रही है। वैसे भी, क्या आप हैंडलर सेट करने के बारे में एक उदाहरण दे सकते हैं request; मुझे यह एक्सप्रेस गाइड में नहीं लगता है।
TheBlueSky

1

यदि आप पोस्ट डेटा का हिस्सा पढ़ने के लिए पर्याप्त आलसी हैं। आप बस नीचे लाइनों को पेस्ट कर सकते हैं पढ़ने के लिए json।

नीचे टाइपस्क्रिप्ट के समान है जेएस के लिए भी किया जा सकता है।

app.ts

 import bodyParser from "body-parser";
 // support application/json type post data
 this.app.use(bodyParser.json());
 // support application/x-www-form-urlencoded post data
 this.app.use(bodyParser.urlencoded({ extended: false }));

आपके किसी भी नियंत्रक में जो नीचे दिखाए गए अनुसार पोस्ट कॉल कॉल प्राप्त करता है

userController.ts

 public async POSTUser(_req: Request, _res: Response) {
   try {
          const onRecord = <UserModel>_req.body;
           /* Your business logic */
           _res.status(201).send("User Created");
        }
    else{
           _res.status(500).send("Server error");
           }        
   };

_req.body आपको अपने TS मॉडल में json डेटा पार्स करना चाहिए।


1
मुझे यकीन नहीं है कि आप लोगों को आलसी कहकर अपने जवाब का उपयोग करने के लिए प्रोत्साहित करने या हतोत्साहित करने की कोशिश कर रहे हैं :)
TheBlueSky

1

मैं JS और ES के लिए बिल्कुल नया हूं, लेकिन जो मेरे लिए काम करता है वह सिर्फ यही है:

JSON.stringify(req.body)

मुझे बताएं कि क्या इसमें कुछ गलत है!


वास्तव में मुझे क्या चाहिए
जोसेफ हेन

0

नीचे कमांड द्वारा बॉडी पार्सर स्थापित करें

$ npm install --save body-parser

बॉडी पार्सर को कॉन्फ़िगर करें

const bodyParser = require('body-parser');
app.use(bodyParser);
app.use(bodyParser.json()); //Make sure u have added this line
app.use(bodyParser.urlencoded({ extended: false }));

-3

पोस्ट डेटा लॉग करने के लिए आप निम्न कोड का उपयोग करते हैं:

router.post("/users",function(req,res){
    res.send(JSON.stringify(req.body, null, 4));
});

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