পোস্টে req.body খালি


255

হঠাৎ করেই আমার সমস্ত প্রকল্পের এটি ঘটছে।

আমি যখনই এক্সপ্রেস এবং বডি পার্সার ব্যবহার করে নোডজে পোস্ট করি তখন req.bodyএকটি খালি অবজেক্ট।

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

var app = express()

// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded())

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

app.listen(2000);

app.post("/", function (req, res) {
  console.log(req.body) // populated!
  res.send(200, req.body);
});

এজাক্স এবং পোস্টম্যানের মাধ্যমে এটি সর্বদা খালি।

তবে কার্লের মাধ্যমে

$ curl -H "Content-Type: application/json" -d '{"username":"xyz","password":"xyz"}' http://localhost:2000/

এটা যেমন কাজ করে।

আমি আগেরটিতে ম্যানুয়ালি সেট করার চেষ্টা করেছি Content-type : application/jsonতবে আমি সবসময় পাই400 bad request

এটি আমাকে পাগল করে চলেছে।

আমি ভেবেছিলাম যে এটি বডি-পার্সারে আপডেট হওয়া কিছু ছিল তবে আমি হ্রাস পেয়েছি এবং এটি কোনও লাভ হয়নি।

কোন সাহায্য প্রশংসা, ধন্যবাদ।


16
তাহলে আপনি Content-Typeপোস্টম্যানকে স্পষ্টভাবে সেট করার চেষ্টা করেছেন ? যদি না হয়, আপনি যে চেষ্টা করতে পারে, আমি পিয়ন একটি না পাঠানো সঙ্গে সামনে সমস্যা ছিল Content-Type
এমএসসিডেক্স

হ্যা, আমি করেছিলাম. আমি যখন 400 পুনরুদ্ধার করেছি: অবৈধ জসন
জোসেফ ডেইলি

@ এসএমসিডিএক্স - ধন্যবাদ আমি পোস্টম্যানে কন্টেন্ট-টুপ সেট করিনি এবং পাগল হয়ে যাচ্ছিলাম :)
আলী

যে সমস্ত লোকেরা এখানে আসছেন তাদের কারণ তারা নিজের API গুলি থেকে ফাইলগুলি প্রেরণ / আপলোড করতে চান এবং সুতরাং ফর্ম-ডেটা ব্যবহার করতে হয়। ফর্ম ডেটা হ্যান্ডেল করার জন্য আপনার কিছু দরকার: npmjs.com/package/multer বেশ জনপ্রিয় প্যাকেজ।
ভাস্কর

যাই হোক না কেন, পোস্টম্যান পূর্ণসংখ্যা এবং ভাসমান মানগুলি খুব ভাল করে না। আপনার যদি পূর্ণসংখ্যা বা ভাসমান মান থাকে তবে কী এবং মান উভয়ই ডাবল উদ্ধৃতি নিশ্চিত করুন
anabeto93

উত্তর:


272

কন্টেন্ট টাইপের জন্য উপলভ্য 3 টি বিকল্পের পোস্টম্যানে "X-www-form-urlencoded" নির্বাচন করুন এবং এটি কাজ করা উচিত।

ত্রুটি বার্তা প্রতিস্থাপন থেকে মুক্তি পেতে:

app.use(bodyParser.urlencoded())

সঙ্গে:

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

Https://github.com/expressjs/body-parser দেখুন

'বডি-পার্সার' মিডলওয়্যার কেবল JSON এবং urlencoded ডেটা পরিচালনা করে, বহুগুণ নয়


এটি পোস্টম্যানের পক্ষে কাজ করেছিল, আমি নিশ্চিত নই যে এটি অজ্যাক্সের সাথে কেন কাজ করে কারণ আমি কিছুই পরিবর্তন করি নি।
জোসেফ ডেলি 21

কোনও কারণে অ্যাঙ্গুলারের মাধ্যমে পোস্টের পোস্টগুলিতে ইউআরএল এনকোড করা দরকার ছিল না, তবে এজাক্স কলগুলি করেছে। কেউ জানেন কেন?
তরুণরrr

এটি আমার পক্ষে কাজ করেছিল, যদিও এটি কাঁচা এনকোডযুক্ত হয়ে কাজ করছে না?
ড্যানিয়েল কোবে

9
এখন দেহ-পার্সার এক্সপ্রেস.জেএসই ব্যবহার সহ অন্তর্নির্মিতapp.use(express.json());
সুজিত অগ্রহরি

তোমাকে অনেক ধন্যবাদ! দীর্ঘ সময় সত্ত্বেও এর উত্তর দেওয়া হলেও এটি এখনও প্রাসঙ্গিক।
স্প্রে'আন'প্রায়

217

পোস্টম্যানের সাথে, কোনও কাঁচা জেএসএন ডেটা পেলোডের সাথে এইচটিটিপি পোস্ট ক্রিয়াগুলি পরীক্ষা করতে, rawবিকল্পটি নির্বাচন করুন এবং নিম্নলিখিত শিরোনামের পরামিতিগুলি সেট করুন:

Content-Type: application/json

এছাড়াও, আপনার জেএসওএন পে-লোডে কী / মান হিসাবে ব্যবহৃত কোনও স্ট্রিংগুলি ডাবল কোটে মুড়ে ফেলতে ভুলবেন না।

body-parserপ্যাকেজ শুধু জরিমানা বহু-লাইন কাঁচা তাদেরকে JSON প্লেলোডগুলি বিশ্লেষণ করতে হবে।

{
    "foo": "bar"
}

নীচে সেটআপ সহ পোস্টম্যান v0.8.4.13 এক্সটেনশন ( body-parserv1.12.2 এবং expressv4.12.3) এর সাথে ক্রোম ভি 37 এবং v41 এ পরীক্ষিত:

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

// configure the app to use bodyParser()
app.use(bodyParser.urlencoded({
    extended: true
}));
app.use(bodyParser.json());

// ... Your routes and methods here

পোস্টম্যান কাঁচা জেসন পেডলোড


ওহ মানুষ, আমি কীভাবে মিস করেছি যে আমি একটি জেএস অবজেক্টকে আক্ষরিকভাবে ফর্ম্যাট করা JSON অবজেক্টের চেয়ে বেশি আড়াল করেছি ...: -স ... ধন্যবাদ বন্ধু!
ওয়েস জনসন

ডাবল উদ্ধৃতিতে কী / মান হিসাবে ব্যবহৃত কোনও স্ট্রিং মোড়ানো ... মিস করা সহজ তবে অন্যথায় মোট ডিল ব্রেকার! ধন্যবাদ.
loxyboi

স্ক্রিনশটগুলির ভাল ব্যবহার।
সান-কুন ক্লার্ক-ডেভিস

form-dataডেটা পোস্ট করতে পোস্টম্যান ব্যবহার করার সময়, আমি সর্বদা {}রেকর্ডে থাকি। আমি Content-Typeবিকল্প সেট করা উচিত ?
মিঙ্গচাউ

56

আমি সত্যিই বোবা ভুল করেছি এবং nameআমার এইচটিএমএল ফাইলটিতে ইনপুটগুলির জন্য বৈশিষ্ট্যগুলি সংজ্ঞায়িত করতে ভুলে গিয়েছি ।

পরিবর্তে তাই

<input type="password" class="form-control" id="password">

আমার আছে এটা.

<input type="password" class="form-control" id="password" name="password">

এখন request.bodyএটির মতো জনবহুল:{ password: 'hhiiii' }


1
বাম। সমস্যা ছিল। ধন্যবাদ!
ম্যাট ওয়েস্ট

এটি হ'ল আমার সমস্যা, নাম মান ব্যতীত একটি ফর্ম ইনপুট, এটি বের করার চেষ্টা করতে ঘন্টা সময় ব্যয় করেছিল। ধন্যবাদ।
কারেনসন্তান

37

আমি আবিষ্কার করেছি, বিষয়বস্তুর প্রকারের সাথে প্রেরণ করার সময় এটি কাজ করে

"অ্যাপ্লিকেশন / JSON"

সার্ভার-সাইডের সাথে সংমিশ্রণে

app.use(bodyParser.json());

এখন আমি মাধ্যমে পাঠাতে পারেন

var data = {name:"John"}
var xmlHttp = new XMLHttpRequest();
xmlHttp.open("POST", theUrl, false); // false for synchronous request
xmlHttp.setRequestHeader("Content-type", "application/json");
xmlHttp.send(data);

এবং ফলাফলটি request.body.nameসার্ভারে উপলব্ধ।


Upvote জন্য ধন্যবাদ। আমি সত্যিই মনে করি এটি সবচেয়ে পরিষ্কার, যদিও সহজ সমাধান নয়, কারণ আপনার যেকোন উপায়ে সঠিক সামগ্রী প্রেরণ করা উচিত। আমি মনে করি.
সান-কুন ক্লার্ক-ডেভিস

এই উত্তর!
জেল

আমার ক্ষেত্রে আমাকে এটিকে পরিবর্তন করতে হয়েছিলxmlHttp.send(JSON.stringify(data));
endo64

18

আমি আজ এই সমস্যায় পড়েছি এবং বিষয়বস্তুর শিরোনামটি মুছে ফেলার জন্য এটি কী ঠিক হয়েছিল এবং পোস্টম্যানের শিরোনামটি ! খুব অদ্ভুত. এটি কারওর সহায়তার ক্ষেত্রে এটিকে এখানে যুক্ত করা।

আমি এখানে বিয়ারলকার টিউটোরিয়ালটি অনুসরণ করছিলাম: http://scottksmith.com/blog/2014/05/29/beer-locker-building-a-restful-api-with-node-passport/


2
আমারো একই ইস্যু ছিল. শিরোনামটি "চেক না করা" (এবং গ্রেড আউট) থাকা যথেষ্ট ছিল না, আমাকে এটি পুরোপুরি সরিয়ে ফেলতে হয়েছিল। যদিও "</>" উত্স বোতামটি দেখায় যে আমি বিষয়বস্তুর ধরণটি চেক করা অবস্থায় না রেখে সেই শিরোনামটি প্রেরণ করছি না, তবুও এটি সম্পূর্ণরূপে অপসারণ করা দরকার।
দ্য রিমিক্স

পোস্টম্যান ক্রোম এক্সটেনশনে কীভাবে ডিফল্ট শিরোনামগুলি সরিয়ে ফেলা যায় তা আমি বুঝতে পারি না ... আপনি সম্ভবত অ্যাপটি ব্যবহার করছেন?
ওয়েস্টলিআরজেন্টাম

ওহ, আমি অ্যাপটি ইনস্টল করেছি এবং এটি এক্সটেনশনের চেয়ে অনেক ভাল কাজ করে। গোলমাল জন্য দুঃখিত।
ওয়েস্টলি আর্জেন্টাম

12

আপনাকে যাচাই করতে হবে বডি-পার্সার মিডলওয়্যার অনুরোধের ধরণের (জেসন, ইউরেলকোডড) সঠিকভাবে সেট করা আছে কিনা।

যদি আপনি সেট করেছেন,

app.use(bodyParser.json());

তারপরে পোস্টম্যানে আপনাকে ডেটা কাঁচা হিসাবে প্রেরণ করতে হবে।

https://i.stack.imgur.com/k9IdQ.png পোস্টম্যানের স্ক্রিনশট

যদি আপনি সেট করেছেন,

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

তারপরে 'x-www-form-urlencoded' বিকল্পটি নির্বাচন করা উচিত।


তাদের উভয় থাকার সম্পর্কে কি? (বডি পার্সার.আরল্যানকোড এবং বডি পার্সার.জসন ()) ... পোস্টম্যানে আমি কোনটি ব্যবহার করতে পারি?
টমিলিওং

9

আমার সমস্যা ছিল আমি প্রথমে রুটটি তৈরি করছিলাম

// ...
router.get('/post/data', myController.postHandler);
// ...

এবং মিডলওয়্যার পরে নিবন্ধন রুটের

app.use(bodyParser.json());
//etc

অ্যাপ্লিকেশন কাঠামোর কারণে এবং উদাহরণটি থেকে একসাথে প্রকল্পটি অনুলিপি এবং আটকানোর জন্য।

আমি একবার রুটের আগে মিডলওয়্যারটি নিবন্ধ করার আদেশ স্থির করে ফেললাম, এটি সব কাজ করেছিল।


ধন্যবাদ সঠিকভাবে, সঠিক অর্ডার দিয়ে এবং কাঁচা ট্যাবটি ব্যবহার করে এটি আমার পক্ষে শেষ পর্যন্ত কাজ করেছে
অ্যালেক্স

4

এমনকি আমি যখন প্রথমবার নোড.জেএস শিখছিলাম যেখানে আমি ওয়েব-অ্যাপের মাধ্যমে এটি শিখতে শুরু করেছিলাম, তখনও আমি আমার ফর্মের মধ্যে এই সমস্ত জিনিসগুলি ভালভাবে সম্পন্ন করে চলেছি, তবুও আমি পোস্টের অনুরোধে মানগুলি অর্জন করতে সক্ষম হইনি। দীর্ঘ ডিবাগিংয়ের পরে, আমি জানতে পারি যে আমি যে ফর্মটি সরবরাহ করেছি তার enctype="multipart/form-data"কারণে আমি মান পেতে সক্ষম হইনি। আমি কেবল এটিকে সরিয়েছি এবং এটি আমার পক্ষে কাজ করে।


হ্যাঁ, এটি ফর্মের দেহ enctype="multipart/form-data"
পেতেও

বিটিডব্লিউ, কেবল আমার উপরের মন্তব্যে যোগ করার জন্য, আমি multer
npmjs.com/package/multer- এ

3

দেখে মনে হচ্ছে আপনি যদি কোনও এনক্রিপ টাইপ না করেন (ডিফল্ট হয় application/x-www-form-urlencoded) তবে আপনি পাঠ্য ইনপুট ক্ষেত্রগুলি পান তবে আপনি ফাইল পাবেন না।

আপনার যদি এমন কোনও ফর্ম থাকে যেখানে আপনি পাঠ্য ইনপুট এবং ফাইল পোস্ট করতে চান তবে multipart/form-dataএনকোডিং টাইপ এবং সেইসাথে multerমিডলওয়্যার ব্যবহার করুন । মল্টার অনুরোধের বস্তুটি বিশ্লেষণ করবে এবং req.fileআপনার জন্য প্রস্তুত করবে এবং অন্যান্য সমস্ত ইনপুট ক্ষেত্রগুলি উপলব্ধ হবে req.body


1
ধন্যবাদ - multerআসলেই আমার সমস্যার সমাধান ছিল। আপনার উত্তরের অংশ হিসাবে এটি কীভাবে ব্যবহার করতে হয় তার একটি উদাহরণ যুক্ত করতে পারলে ভাল হবে
tsando

2

আমার সাথে একই রকম সমস্যা হয়েছে, আমি কেবল কলব্যাকের প্যারামগুলির ক্রমটি মিশ্রিত করেছি। আপনি সঠিক ক্রমে কলব্যাক ফাংশন সেট আপ করছেন তা নিশ্চিত করুন। কমপক্ষে কারও জন্য একই সমস্যা রয়েছে।

router.post('/', function(req, res){});

2

নিশ্চিত করুন যে ["কী": "টাইপ", "মান": "জসন"] & ["কী": "বিষয়বস্তুর ধরণ", "মান": "অ্যাপ্লিকেশন / এক্স-www-ফর্ম-urlencoded"] আপনার মধ্যে রয়েছে পোস্টম্যান অনুরোধ শিরোনাম


2

আমি এটি multerউপরে বর্ণিত হিসাবে ব্যবহার করে সমাধান করেছি , তবে তারা কীভাবে এটি করতে পারে তার জন্য একটি পুরো কাজের উদাহরণ দেওয়া মিস করে। মূলত এটি যখন আপনার সাথে একটি ফর্ম গ্রুপ থাকে তখনই ঘটতে পারে enctype="multipart/form-data"। আমার যে ফর্মটি ছিল তার HTML এখানে রয়েছে:

<form action="/stats" enctype="multipart/form-data" method="post">
  <div class="form-group">
    <input type="file" class="form-control-file" name="uploaded_file">
    <input type="text" class="form-control" placeholder="Number of speakers" name="nspeakers">
    <input type="submit" value="Get me the stats!" class="btn btn-default">            
  </div>
</form>

এবং এখানে কিভাবে ব্যবহার করবেন তা multerসঙ্গে মূল্যবোধ ও এই ফর্মটি নাম পেতে Express.jsএবং node.js:

var multer  = require('multer')
var upload = multer({ dest: './public/data/uploads/' })
app.post('/stats', upload.single('uploaded_file'), function (req, res) {
   // req.file is the name of your file in the form above, here 'uploaded_file'
   // req.body will hold the text fields, if there were any 
   console.log(req.file, req.body)
});

1

কয়েক মিনিট আগে আমারও একই সমস্যা ছিল, উপরের উত্তরগুলিতে আমি যথাসাধ্য চেষ্টা করেছিলাম কিন্তু তাদের মধ্যে কেউ কাজ করেছে।

আমি কেবল একটাই করেছি, নোড জেএস সংস্করণটি আপগ্রেড করছিলাম, আমি জানতাম না যে আপগ্রেডিং কোনও ক্ষেত্রে প্রভাব ফেলতে পারে, তবে তা ঘটেছে।

আমি নোড জেএস সংস্করণ 10.15.0(সর্বশেষ সংস্করণ) ইনস্টল করেছি , আমি ফিরে এসেছি 8.11.3এবং সবকিছু এখন কাজ করছে। হয়তো body-parserমডিউল এই একটি ফিক্স গ্রহণ করা উচিত।


1

আমার ইনপুটটিতে নামটি ছিল না ... আমার অনুরোধটি খালি ছিল ... খুশি যে শেষ হয়েছে এবং আমি কোডিং রাখতে পারি। ধন্যবাদ সবাইকে!

উত্তর আমি জেসন কিম দ্বারা ব্যবহৃত:

পরিবর্তে তাই

<input type="password" class="form-control" id="password">

আমার আছে এটা

<input type="password" class="form-control" id="password" name="password">

1

JSON.stringify(data)নীচের মত AJAX মাধ্যমে প্রেরণ করার সময় আপনি করবেন না ।

এটি সঠিক কোড নয়:

function callAjax(url, data) {
    $.ajax({
        url: url,
        type: "POST",
        data: JSON.stringify(data),
        success: function(d) {
            alert("successs "+ JSON.stringify(d));
        }
    });
}   

সঠিক কোডটি হ'ল:

function callAjax(url, data) {
    $.ajax({
        url: url,
        type: "POST",
        data: data,
        success: function(d) {
            alert("successs "+ JSON.stringify(d));
        }
    });
}

এখানে লক্ষ্য করার জন্য একটি মূল বিষয় হ'ল টাইপ করে, নিশ্চিত করুন যে আপনি "পোস্ট" কে মূলধন করেছেন। আমি এমন উদাহরণগুলি দেখেছি যেখানে কেবল "পোস্ট" ব্যবহার করা ফাঁকা রেকর্ডে পৌঁছেছে।
ম্যাট সি

1

আপনি যদি পোস্টম্যানের সাথে করছেন, আপনি যখন এপিআইয়ের অনুরোধ করছেন তখন দয়া করে এই জিনিসগুলি নিশ্চিত করুন

এখানে চিত্র বর্ণনা লিখুন


0

আমি এক্সপ্রেসের পরিবর্তে রাইসাইফাই ব্যবহার করছিলাম এবং একই সমস্যায় পড়েছি। সমাধানটি হ'ল:

server.use(restify.bodyParser());


0

app.use(bodyParser.urlencoded());আপনার কোড এ পরিবর্তন করুন

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

এবং পোস্টম্যানে, শিরোনামে Content-Typeথেকে মান পরিবর্তন application/x-www-form-urlencodedকরেapplication/json

তোমাকে ধন্যবাদ :-)


0

আপনার দুর্দান্ত উত্তরের জন্য সবাইকে ধন্যবাদ! সমাধান অনুসন্ধানের জন্য বেশ কিছু সময় ব্যয় করেছি এবং আমার পক্ষে আমি একটি প্রাথমিক ভুল করছিলাম: আমি bodyParser.json()ফাংশনটির মধ্যে থেকে ফোন করছি :

app.use(['/password'], async (req, res, next) => {
  bodyParser.json()
  /.../
  next()
})

আমার শুধু দরকার ছিল app.use(['/password'], bodyParser.json())এবং এটি কাজ করেছে ...


0

পোস্টম্যানে, গৃহীত উত্তর অনুসরণ করার পরেও, আমি একটি খালি অনুরোধের বডি পাচ্ছি। সমস্যাটি শিরোনামহীন একটি হেডারকে পাস না করে চলেছে

Content-Length : <calculated when request is sent>

এই শিরোনামটি ডিফল্টরূপে উপস্থিত ছিল (অন্য 5 জন সহ) যা আমি অক্ষম করেছি। এটি সক্ষম করুন এবং আপনি অনুরোধের বডিটি পাবেন।


0

আমার সমস্যাটি আগে রুটটি তৈরি করছিল require("./routes/routes")(app); আমি আগে কোডের শেষে এটিকে স্থানান্তরিত করেছি app.listen এবং এটি কাজ করেছিল!

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.