বডি পার্সার এক্সপ্রেশন দিয়ে কি করে?


339

body-parserএক্সপ্রেস অ্যাপ্লিকেশনটিতে কেন আমাদের প্রয়োজন তা আমি বুঝতে পারি না , কারণ আমরা ব্যবহার না করেই ডেটা পেতে পারি body-parser। এবং এটি আসলে কী করে এবং কীভাবে?


54
এইচটিটিপি পোস্টের ডেটা পড়তে আমাদের "বডি পার্সার" নোড মডিউলটি ব্যবহার করতে হবে। বডি পার্সার হ'ল এক্সপ্রেস মিডলওয়্যারের একটি অংশ যা কোনও ফর্মের ইনপুটটি পড়ে এবং এটি জাভাস্ক্রিপ্ট অবজেক্ট হিসাবে প্রবেশযোগ্য হিসাবে সংরক্ষণ করেreq.body
রিফ্যাক্টর

2
এক্সপ্রেসের সাহায্যে আপনি এইচটিটিপি অনুরোধের মধ্যে যেমন কোনও শিরোনাম req.headers(অ্যারে) এর ভিতরে কোনও ডেটা পড়তে পারেন , আপনি req.body@ ক্লিনক্রিস্পকোড দ্বারা ব্যাখ্যা করা হিসাবে HTTP প্যাকেটের মূল অংশটি পড়তে পারেন এবং কোয়েরি প্যারামিটার হিসাবে পড়তে পারেন req.query.variable, এটি এক্সপ্রেশনটি জাভাস্ক্রিপ্টে স্বয়ংক্রিয়ভাবে অনুরোধটিকে রূপান্তরিত করতে সহায়তা করে অবজেক্টস
ফার্নান্দো জাম্পেরিন

3
@refactor - এই হতে পারে এক অনেক কারণ আমরা ব্যবহার আছে শরীর পার্সার, কিন্তু এটা বলে না এটা কি করে, অর্থাত যে HTTP অনুরোধ এবং প্রতিক্রিয়া বস্তু স্ট্রিম এবং তারা একক অবজেক্ট হিসেবে না হন যে 'পাঠযোগ্য' মত res.bodyসমগ্র প্রবাহ ছাড়া মধ্যে বাফার হচ্ছে res.bodyপ্রথম।
অর্টনোমি

1
এক্সপ্রেস সংস্করণ ৪.১16++ সহ তারা তাদের নিজের তৈরি বডি পার্সারের নিজস্ব সংস্করণ অন্তর্ভুক্ত করেছে যাতে আপনাকে এই প্যাকেজটি টানতে হবে না।
স্টেফানবোজ ২

উত্তর:


255

এক্সপ্রেস.জেএস ভার্সন 4 এবং এর উপরের সংস্করণে HTTP POSTঅনুরোধটি পরিচালনা করতে আপনাকে মিডলওয়্যার নামে পরিচিত মডিউলটি ইনস্টল করতে হবে ।body-parser

body-parserআগত অনুরোধ স্ট্রিমের পুরো শরীরের অংশটি বের করুন এবং এটিকে প্রকাশ করুন req.body

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

এই body-parserমডিউলটি HTTP POSTঅনুরোধ ব্যবহার করে জমা দেওয়া জেএসএন, বাফার, স্ট্রিং এবং ইউআরএল এনকোডড ডেটা পার্স করে । body-parserনীচের মত এনপিএম ব্যবহার করে ইনস্টল করুন ।

npm install body-parser --save

2019-এপ্রিল -2 এ সম্পাদনা করুন: এক্সপ্রেস@4.16.0 এ বডি পার্সার মিডলওয়্যার এক্সপ্রেসের সাথে বান্ডিল। আরও তথ্যের জন্য এটি দেখুন


126
এটি সম্ভবত সম্ভবত সবচেয়ে খোঁড়া জিনিস। এক্সপ্রেস কোর ডেভস ওয়েব ডেভলপমেন্টে সর্বাধিক সাধারণ ব্যবহারের ক্ষেত্রে অতিরিক্ত মিডলওয়্যার ইনস্টল করে তাদের নতুন বোর্ডে উঠা কেন অবিশ্বাস্যরকম কঠিন করবে?
এলমেট

5
@ এলএমটি যদি আপনি মতামত দিয়ে কিছু চান, তবে সেলস.জেএস চেষ্টা করুন
জর্জ

1
@ ব্যবহারকারী 1063287 হ্যাঁ এটি করে। urlencoded()এবং json()প্রকৃতপক্ষে মিডলওয়্যার কারখানাগুলি যা মিডলওয়্যার ফাংশনটি ফিরিয়ে দেয় যা আবেদন করেnext()
নিক ম্যানিং

3
এটি খোঁড়া @ ইলমেট নয়, নোড কেবল ওয়েবের জন্য নয়, এটি ডেস্কটপ, মোবাইল ইত্যাদি ব্যবহার করা যায় এবং এই ক্ষেত্রে এটি প্রয়োজনীয় মডিউল নয়। নোড কোনও প্রকার দায় ছাড়াই আপনার আবেদনের সাথে মানিয়ে নিতে পারে
fnaquira

27
@fnaquira - আপনি বিভ্রান্ত এটি এক্সপ্রেস নোড সম্পর্কে।
এলমেট

85

হ্যাঁ আমরা ছাড়া কাজ করতে পারি body-parser। যখন আপনি এটি ব্যবহার করেন না যে আপনি কাঁচা অনুরোধ পেয়েছেন, এবং আপনার শরীর এবং শিরোনামগুলি অনুরোধ প্যারামিটারের মূল অবজেক্টে নেই। আপনাকে স্বতন্ত্রভাবে সমস্ত ক্ষেত্র ম্যানিপুলেট করতে হবে।

বা আপনি ব্যবহার করতে পারেন body-parser, যেমন এক্সপ্রেস টিম এটি বজায় রাখছে।

বডি পার্সার আপনার জন্য কী করতে পারে: এটি অনুরোধটিকে সহজ করে।
এটি কীভাবে ব্যবহার করবেন: উদাহরণস্বরূপ:

ইনস্টল করুন npm install body-parser --save

এক্সপ্রেসে বডি পার্সার কীভাবে ব্যবহার করবেন:

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

// support parsing of application/json type post data
app.use(bodyParser.json());

//support parsing of application/x-www-form-urlencoded post data
app.use(bodyParser.urlencoded({ extended: true }));

লিঙ্ক করুন।

https://github.com/expressjs/body-parser

এবং তারপরে আপনি রুট রিকোয়েস্ট অবজেক্টে বডি এবং হেডার পেতে পারেন। উদাহরণ

app.post("/posturl",function(req,res,next){
    console.log(req.body);
    res.send("response");
})

3
এই তথ্যের জন্য ধন্যবাদ, আপনি কি শরীরের পার্সার ছাড়াই একটি কোড উদাহরণ পোস্ট করতে পারেন?
ইলিয়াস করিম

55

উত্তর এখানে ব্যাখ্যা এটা খুব বিস্তারিত এবং বুদ্ধিদীপ্তভাবে, উত্তর রয়েছে:

সংক্ষেপে; বডি পার্সার আগত অনুরোধ স্ট্রিমের পুরো শরীরের অংশটি বের করে এবং এর req.bodyসাথে ইন্টারফেস করার সহজ কিছু হিসাবে প্রকাশ করে । আপনার প্রতি সেটির দরকার নেই, কারণ আপনি নিজেরাই এটি করতে পারতেন। যাইহোক, এটি সম্ভবত আপনি যা চান তা করবে এবং আপনার সমস্যাটি বাঁচাবে।


গভীরতায় আরও কিছুটা যেতে; বডি পার্সার আপনাকে এমন মিডলওয়্যার দেয় যা আগত অনুরোধের ডেটা আনজিপ করতে নোডেজ / জিলিবি ব্যবহার করে যদি এটি জিপ করা হয় এবং "পার্সিং" করার আগে অনুরোধের শরীরে পূর্ণ, কাঁচামাল প্রতীক্ষার জন্য স্ট্রিম-ইউটস / কাঁচা-বডি (এটির অর্থ এই যে যদি আপনি অনুরোধ সংস্থাটি ব্যবহার করবেন না, আপনি কিছুটা সময় নষ্ট করেছেন)।

কাঁচা সামগ্রী থাকার পরে, বডি পার্সার আপনি যে নির্দিষ্ট মিডলওয়্যারটি ব্যবহার করার সিদ্ধান্ত নিয়েছেন তার উপর নির্ভর করে চারটি কৌশলগুলির মধ্যে একটির ব্যবহার করে পার্স করবে:

  • বডি পার্সার.আরও () : আসলে শরীরকে বিশ্লেষণ করে না, তবে একটি থেকে আগে থেকে বাফারড সামগ্রীগুলি প্রকাশ করে বাফার উপর req.body

  • বডি পার্সার.টেক্সট () : সরল পাঠ্য হিসাবে বাফারটি পড়েন এবং ফলাফলের স্ট্রিংটিকে req.body তে প্রকাশ করে।

  • bodyParser.urlencoded () : URL টি এনকোডড ডেটা হিসাবে পাঠ্যটিকে পার্স করে (যা ব্রাউজারগুলি নিয়মিত ফর্মগুলি থেকে POST এ সেট করা ফর্ম ডেটা প্রেরণে প্রবণতা দেখায়) এবং ফলাফল অবজেক্টটিকে (কীগুলি এবং মানগুলি সমন্বিত করে) উন্মোচিত করেreq.body । তুলনার জন্য; পিএইচপি-এ এই সমস্ত কিছুই স্বয়ংক্রিয়ভাবে সম্পন্ন হয়ে যায় এবং প্রকাশিত হয় $_POST

  • bodyParser.json () : parses JSON এবং অনাবৃত উপর ফলে বস্তুর হিসাবে পাঠ্য req.body

শুধুমাত্র সেট করার পরে req.bodyপছন্দসই বিষয়বস্তুগুলিতে এটি স্ট্যাকের পরবর্তী মিডওয়্যারটিকে কল করবে, এটি কীভাবে আনজিপ এবং পার্স করতে হবে তা চিন্তা না করেই অনুরোধের ডেটা অ্যাক্সেস করতে পারে।

আপনি তাদের ডকুমেন্টেশনগুলি পড়তে বডি পার্সার গিথুবকে উল্লেখ করতে পারেন , এতে এর কার্য সম্পর্কিত তথ্য রয়েছে।


47

আসুন এটি সর্বনিম্ন প্রযুক্তিগত রাখার চেষ্টা করি।

ধরা যাক আপনি নোড-জেএস সার্ভারে এইচটিএমএল ফর্ম ডেটা প্রেরণ করছেন অর্থাত আপনি সার্ভারে একটি অনুরোধ করেছেন। সার্ভার ফাইলটি আপনার অনুরোধের অনুরোধের আওতায় আসবে receive এখন যুক্তি দিয়ে, আপনি যদি এই সার্ভারের ফাইলে এই অনুরোধটি অবজেক্টটি কনসোল করেন তবে আপনার ফর্মের ডেটা দেখতে হবে যেখানে এটি থাকা উচিত, তবে কে! আপনি আসলে না!

সুতরাং, আমাদের তথ্য কোথায়? এটি কেবল আমার অনুরোধে উপস্থিত না হলে আমরা কীভাবে এটি নিষ্কাশন করব।

এর সহজ ব্যাখ্যা হ'ল HTTP আপনার ফর্মের ডেটা বিট এবং টুকরোগুলিতে প্রেরণ করে যা লক্ষ্য হিসাবে তারা তাদের গন্তব্যে পৌঁছানোর পরে একত্রিত হওয়ার জন্য। সুতরাং আপনি কীভাবে আপনার ডেটা বের করবেন।

তবে কেন, প্রতিবারের এই ব্যথাটি ম্যানুয়ালি আপনার খণ্ডগুলির জন্য ডেটা বিশ্লেষণ এবং এটি একত্রিত করার জন্য নিন। "বডি পার্সার" নামক কিছু ব্যবহার করুন যা এটি আপনার জন্য করবে।

বডি পার্সার আপনার অনুরোধটিকে পার্স করে এবং এটিকে এমন ফর্ম্যাটে রূপান্তর করে যা থেকে আপনি সহজেই আপনার প্রয়োজনীয় প্রাসঙ্গিক তথ্য বের করতে পারেন।

উদাহরণস্বরূপ, আসুন ধরা যাক আপনার সীমান্তে আপনার সাইন আপ ফর্ম রয়েছে। আপনি এটি পূরণ করছেন এবং কোথাও বিশদটি সংরক্ষণ করার জন্য সার্ভারকে অনুরোধ করছেন।

আপনার অনুরোধ থেকে ব্যবহারকারীর নাম এবং পাসওয়ার্ড উত্তোলন নীচের মতই সরল you

var loginDetails = {    
    username : request.body.username,    
    password : request.body.password    
};

সুতরাং মূলত, দেহ-পার্সার আপনার আগত অনুরোধটিকে পার্স করেছে, আপনার ফর্ম ডেটা সম্বলিত অংশগুলিকে একত্রিত করেছে, তারপরে আপনার জন্য এই বডি অবজেক্টটি তৈরি করেছে এবং এটি আপনার ফর্ম ডেটা দিয়ে পূর্ণ করেছে।


10

এটি এইচটিটিপি রিকোয়েস্টের বডি পার্স করে। আপনি সাধারণত যে URL টি আঘাত করেছেন কেবল তার চেয়ে বেশি জানতে আপনাকে যখন এটি প্রয়োজন তখন এটি সাধারণত প্রয়োজন হয়, বিশেষত কোনও পোষ্ট বা পুট প্যাচ এইচটিটিপি অনুরোধের প্রসঙ্গে যেখানে আপনি যে তথ্য চান তা দেহে থাকে contains

মূলত এটি JSON, সাধারণ পাঠ্যকে পার্স করার জন্য বা আপনার প্রয়োজনমতো ডিল করার জন্য কোনও কাঁচা বাফার অবজেক্ট ফিরিয়ে দেওয়ার জন্য এটি একটি মিডওয়্যার।


8

পোস্ট ডেটা অ্যাক্সেস পেতে আমাদের ব্যবহার করতে হবে body-parser। মূলত এটি কী body-parserতা যা শরীরকে পড়তে এবং তারপরে এমন একটি Jsonবস্তুকে পার্স করতে দেয় যা আমরা বুঝতে পারি।


7

এগুলি সব সুবিধার বিষয়।

মূলত, যদি প্রশ্নটি ছিল 'আমাদের কি ব্যবহার করা দরকার?body-parser ?' উত্তরটি 'না'। আমরা আরও বেশি সার্কিটাসিক রুট ব্যবহার করে ক্লায়েন্ট-পোস্ট-অনুরোধ থেকে একই তথ্যটি নিয়ে আসতে পারি যা সাধারণত কম নমনীয় হবে এবং একই তথ্য পেতে আমাদের যে পরিমাণ কোড লিখতে হবে তা বাড়িয়ে তুলবে।

এটি 'আমাদের কী ব্যবহার করা দরকার?express দিয়ে শুরু করতে?' আবার, উত্তরটির কোনও উত্তর নেই এবং আবারও, সত্যই এটি 'বিল্ট-ইন'-এর সাথে প্রকাশিত মৌলিক জিনিসগুলি করার জন্য আরও কোড লেখার ঝামেলা বাঁচানোর জন্য নেমে আসে।

পৃষ্ঠতলে - body-parserক্লায়েন্টের অনুরোধগুলিতে থাকা তথ্যগুলি বিভিন্ন ধরণের ফর্ম্যাটগুলিতে আপনাকে কাঁচা ডেটা স্ট্রিমগুলি ক্যাপচার করার পরিবর্তে এবং তথ্যটি কী ফর্ম্যাটটিতে রয়েছে তা নির্ধারণের পরিবর্তে তথ্যটিকে সহজে ব্যবহারযোগ্য ডেটাতে পার্স করা সহজ করে তোলে।


6

অনুরোধের বডি বোঝা

কোনও পোষ্ট বা পুট অনুরোধ পাওয়ার সময়, অনুরোধের বডিটি আপনার আবেদনের জন্য গুরুত্বপূর্ণ হতে পারে। অনুরোধ শিরোনাম অ্যাক্সেসের চেয়ে বডি ডেটা পাওয়া একটু বেশি জড়িত। কোনও হ্যান্ডলারের কাছে প্রেরিত অনুরোধের উপাদানটি পঠনযোগ্য স্ট্রিম ইন্টারফেস প্রয়োগ করে। এই স্ট্রিমটি অন্য প্রবাহের মতো শোনা যায় বা অন্য কোথাও পাইপ করা যায়। স্ট্রিমের 'ডেটা' এবং 'শেষ' ইভেন্টগুলি শুনে আমরা সরাসরি স্ট্রিমের বাইরে ডেটা ধরতে পারি।

প্রতিটি 'ডেটা' ইভেন্টে নির্গত অংশটি বাফার। যদি আপনি জানেন যে এটি স্ট্রিং ডেটা হতে চলেছে, তবে সবচেয়ে ভাল কাজটি হ'ল একটি অ্যারেতে ডেটা সংগ্রহ করা, তারপরে 'শেষে', এটি যুক্ত করে স্ট্রিংফায়েট করা।

let body = [];
request.on('data', (chunk) => {
  body.push(chunk);
}).on('end', () => {
  body = Buffer.concat(body).toString();
  // at this point, `body` has the entire request body stored in it as a string
});

বডি পার্সার বোঝা

এর ডকুমেন্টেশন অনুযায়ী

আপনার হ্যান্ডলারের সামনে আগত অনুরোধ সংস্থাগুলি পার্স করুন, যা রেইক.বডি সম্পত্তি হিসাবে উপলব্ধ।

আপনি যেমন প্রথম উদাহরণে দেখেছেন, আমাদের দেহটি বের করার জন্য আগত অনুরোধ স্ট্রিমটিকে ম্যানুয়ালি পার্স করতে হয়েছিল। বিভিন্ন ধরণের একাধিক ফর্ম ডেটা থাকাকালীন এটি এক ক্লান্তিকর হয়ে ওঠে। সুতরাং আমরা বডি পার্সার প্যাকেজ ব্যবহার করি যা হুডের অধীনে এই সমস্ত কাজ করে।

এটি বিভিন্ন ধরণের ডেটা পার্স করার জন্য চারটি মডিউল সরবরাহ করে

কাঁচামাল থাকার পরে বডি-পার্সার ডেটা পার্স করার জন্য উপরের কৌশলগুলির একটি (মিডলওয়্যারের উপর নির্ভর করে আপনি ব্যবহার করার সিদ্ধান্ত নিয়েছিলেন) ব্যবহার করবেন। তাদের ডকুমেন্টেশন পড়ে আপনি তাদের সম্পর্কে আরও পড়তে পারেন।

req.bodyপার্সড বডিটিতে সেট করার পরে , বডি পার্সার next()পরবর্তী মিডওয়্যারটিকে স্ট্যাকের নীচে কল করতে অনুরোধ করবে, যা কীভাবে আনজিপ এবং পার্স করতে হবে তা চিন্তা না করেই অনুরোধের ডেটা অ্যাক্সেস করতে পারে।

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