নোড.জেএস এবং এক্সপ্রেস ব্যবহার করে পোস্টিং করার সময় কীভাবে অনুরোধের বডিটি অ্যাক্সেস করবেন?


174

আমার কাছে নিম্নলিখিত নোড.জেএস কোড রয়েছে:

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)কিন্তু নোড.জেস একটি ব্যতিক্রম ছুঁড়ে বলেছে " প্রথম যুক্তিটি অবশ্যই স্ট্রিং বা বাফার হতে হবে " তারপরে একটি "অসীম লুপ" এ যায় যা বলে যে " তারা পাঠানোর পরে শিরোনাম সেট করতে পারে না "; আমি var reqBody = request.body;এবং তারপর লেখার পরেও এটি সত্য response.write(reqBody)

এখানে সমস্যা কি?

এছাড়াও, আমি express.bodyParser()কী ব্যবহার না করে কেবল কাঁচা অনুরোধ পেতে পারি ?


মনে হচ্ছে এর সাথে কিছু আছে response.write(reqBody); আমি যখন response.send(reqBody)জিনিসগুলি ব্যবহার করি তখন ঠিকঠাক কাজ হয় ... এবং হ্যাঁ, আমি response.endপরে ব্যবহার করি response.write
দ্য ব্লুস্কি

উত্তর:


161

এক্সপ্রেস ৪.০ এবং তারপরের:

$ npm install --save body-parser

এবং তারপরে আপনার নোড অ্যাপে:

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

এক্সপ্রেস 3.0.০ এবং নীচে:

আপনার সিআরএল কলটিতে এটি পাস করার চেষ্টা করুন:

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

এবং আপনার তথ্যটি JSON ফর্ম্যাটে রয়েছে তা নিশ্চিত করে:

{"user":"someone"}

এছাড়াও, আপনি নীচের উদাহরণের মতো অবজেক্টের অভ্যন্তরীণ ডেটা দেখতে আপনার নোড.জেএস কোডে কনসোল.ডির ব্যবহার করতে পারেন:

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);

এই অন্যান্য প্রশ্নটিও সহায়তা করতে পারে: এক্সপ্রেস নোড.জেএস পোস্টের অনুরোধে জেএসএন কীভাবে পাবেন?

আপনি যদি বডি পার্সার ব্যবহার করতে না চান তবে এই অন্যান্য প্রশ্নটি দেখুন: https://stackoverflow.com/a/9920700/446681


আমি ব্যবহারের চেষ্টা করেছি curl -d {"user":"Someone"} -H "Content-Type: application/json" --url http://localhost:5000কিন্তু এটি আমাকে " অপ্রত্যাশিত টোকেন ইউ " ত্রুটি দিচ্ছিল , এজন্য আমি আমার মূল পোস্টে উল্লিখিত কলটিতে স্যুইচ করেছি।
দ্য ব্লুস্কি

আমি লিংক কারণ উত্তর হিসাবে এই উপলক্ষে করছি stackoverflow.com/a/9920700/446681
TheBlueSky

40
express.bodyParser()এক্সপ্রেস ৪.x এ অবমুক্ত করা হয়েছে ব্যবহার করুন npmjs.org/package/body-parser পরিবর্তে।
লু

@ দ্য ব্লুস্কি আপনার "অপ্রত্যাশিত টোকেন ইউ" পাওয়ার কারণ হ'ল শেলটি আপনার ডাবল উদ্ধৃতিগুলি গ্রাস করেছে। আপনি যদি একই জিনিস ঘটে echo any"thing"। এটি যাতে না ঘটে সে জন্য আপনি যে ডেটা পোস্ট করছেন তা উদ্ধৃতিগুলির মধ্যে থাকা উচিত।
টম ফেনেক

11
এক্সপ্রেস ৪.১.0.০ বা তার থেকেও উপরে অ্যাপ.ইউজে () এ এক্সপ্রেস.জসন () ব্যবহার করা সম্ভব = = অ্যাপ.ইউজ (এক্সপ্রেস.জসন ());
মিত্রো

187

এক্সপ্রেস ভি .1.১6 থেকে শুরু করে কোনও অতিরিক্ত মডিউলের প্রয়োজন নেই, কেবল বিল্ট-ইন জেএসএন মিডলওয়্যার ব্যবহার করুন :

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+ এর জন্য সেরা উত্তর answer অন্য কোন নির্ভরতা এবং কবজ মত কাজ করে না!
কোডেবলব

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 })হয় এছাড়াও প্রয়োজনীয়? আমি অনুরোধে জাসন হিসাবে একটি জটিল কাগজ পোস্ট করছি, এবং extended: falseকাজ হয়নি। আমি যখন এটি সত্যে সেট করি কেবল তখনই অনুরোধটি সঠিকভাবে বিশ্লেষণ করা হয়।
ওয়েব ব্যবহারকারী

3
শুধু একটি নোট. নোডজেএস এবং এক্সপ্রেসের সাথে একটি ডাব্লুএস লিনাক্স সার্ভার সেটআপে জসন ডেটা পেতে 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);

এটি আপনাকে সাহায্য করবে। আমি ধরে নিচ্ছি আপনি জসনে দেহ পাঠাচ্ছেন।


আমি বডি পার্সার.জসন () বিট 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তবে ইভেন্টগুলি dataএবং endইভেন্টগুলির জন্য হ্যান্ডলারগুলি সেট করুন (এবং অবশ্যই এর যে কোনও অনুরোধ সরিয়ে ফেলুন express.bodyParser())। নোট করুন যে dataঘটনাগুলি খণ্ডগুলিতে ঘটবে, এবং আপনি যদি dataইভেন্টটির জন্য কোনও এনকোডিং সেট না করেন unless খণ্ডগুলি স্ট্রিং নয় বরং বাফার হবে।


এটি একটি অনুলিপি-পেস্ট ভুল ছিল; আমি বলতে চাইছিলাম request.bodyএবং না request.body.user, এবং আমি এখনই এটি সংশোধন করেছি। যাইহোক, এটি var reqBody = request.body;ছিল এবং এখনও সঠিক এবং আপনি এটি চেষ্টা করার পরে আমি যে ত্রুটি পাচ্ছি তা পেয়ে যাবেন। যাইহোক, আপনি দয়া করে হ্যান্ডলারটি সেট করার বিষয়ে একটি উদাহরণ দিতে পারেন request; আমি এটি এক্সপ্রেস গাইডে খুঁজে পেয়েছি বলে মনে হয় না।
দ্য ব্লুস্কি

1

আপনি যদি পোস্ট ডেটার অংশগুলি পড়তে যথেষ্ট অলস হন। আপনি জসন পড়ার জন্য কেবল লাইনগুলির নিচে পেস্ট করতে পারেন।

নীচে টাইপস্ক্রিপ্টের জন্য একইভাবে জেএসের জন্যও করা যেতে পারে।

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 }));

আপনার যে কোনও নিয়ামকের নীচে দেখানো হিসাবে পোষ্ট কল ব্যবহার পাবেন use

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");
           }        
   };

_আরেক.বডি আপনার টিএস মডেলটিতে আপনাকে জসন ডেটা পার্স করা উচিত।


1
আমি নিশ্চিত না আপনি লোকদের অলস বলে ডেকে আপনার উত্তরটি ব্যবহার করতে উত্সাহিত বা নিরুৎসাহিত করার চেষ্টা করছেন কিনা তা
দ্য ব্লুস্কি

1

আমি জেএস এবং ইএস-এ একেবারে নতুন, তবে আমার পক্ষে যা কাজ করছে বলে মনে হচ্ছে তা কেবল এটি:

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
বডি-পার্সার মডিউলটি বাদ দিয়ে দেওয়া উত্তর অসম্পূর্ণ।
গ্রামাচা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.