Node.js এ POST ডেটা কীভাবে প্রসেস করবেন?


635

আপনি কীভাবে নোড.জেজেform[method="post"] HTTP POSTপদ্ধতি থেকে ফর্ম ডেটা ( ) এবং ফাইল আপলোডগুলি আহরণ করবেন ?

আমি ডকুমেন্টেশন পড়েছি, গুগল করেছিলাম এবং কিছুই পাইনি।

function (request, response) {
    //request.post????
}

লাইব্রেরি আছে নাকি হ্যাক?

উত্তর:


551

আপনি যদি এক্সপ্রেস (উচ্চ-কর্মক্ষমতা, নোড.জেএস এর জন্য উচ্চ-শ্রেণীর ওয়েব বিকাশ) ব্যবহার করেন তবে আপনি এটি করতে পারেন:

এইচটিএমএল:

<form method="post" action="/">
    <input type="text" name="user[name]">
    <input type="text" name="user[email]">
    <input type="submit" value="Submit">
</form>

এপিআই ক্লায়েন্ট:

fetch('/', {
    method: 'POST',
    headers: {
        'Content-Type': 'application/json'
    },
    body: JSON.stringify({
        user: {
            name: "John",
            email: "john@example.com"
        }
    })
});

নোড.জেএস: (এক্সপ্রেস v4.16.0 থেকে)

// Parse URL-encoded bodies (as sent by HTML forms)
app.use(express.urlencoded());

// Parse JSON bodies (as sent by API clients)
app.use(express.json());

// Access the parse results as request.body
app.post('/', function(request, response){
    console.log(request.body.user.name);
    console.log(request.body.user.email);
});

নোড.জেএস: (এক্সপ্রেস <4.16.0 এর জন্য)

const bodyParser = require("body-parser");

/** bodyParser.urlencoded(options)
 * Parses the text as URL encoded data (which is how browsers tend to send form data from regular forms set to POST)
 * and exposes the resulting object (containing the keys and values) on req.body
 */
app.use(bodyParser.urlencoded({
    extended: true
}));

/**bodyParser.json(options)
 * Parses the text as JSON and exposes the resulting object on req.body.
 */
app.use(bodyParser.json());

app.post("/", function (req, res) {
    console.log(req.body.user.name)
});

45
কার্যকারিতাটি আসলে সংযোগের বডি পার্সার মডিউলে থাকে, যদি আপনি নিম্ন স্তরের এন্ট্রি পয়েন্ট ব্যবহার করতে চান।
জুলিয়ান বার্চ

14
আমি বিভ্রান্ত কীভাবে নাম = "ব্যবহারকারী [ইমেল]" অনুরোধ.body.email এর সাথে মিল রাখে?
sbose

36
সৃষ্টিকর্তা!! একই কাঠামোর জন্য একই সাথে 3 টি ডুমেন্টেশন পড়তে পাগল হয়ে যাচ্ছি: / নোডেজ.এস.পি / পিটিএইচটিপি.এইচটিএমএল , সেনচলাবস.অর্গ / সংযুক্তিএক্সপ্রেসজেজ / গুইডিএইচটিএমএল
সালমান ভন আব্বাস

15
আমি যোগ না করা পর্যন্ত এটি আমার পক্ষে কাজ করে না app.use(express.bodyParser());
পেটিস

13
এক্সপ্রেসটি হল ক্লায়েন্ট সাইড জেএসের কাছে jQuery কী নোড। আমি যখনই নোডের জন্য গুগল করি তখনই আমি এই লম্পটগুলি "ব্যবহার এক্সপ্রেস!" উত্তর। পোস্ট ডেটা পার্স করা সত্যিই কি এতটা কঠিন যে এটি একটি সম্পূর্ণ ওয়েব কাঠামো ইনস্টল করার ন্যায্যতা প্রমাণ করে?
শন হোয়েনারি

710

আপনি querystringমডিউলটি ব্যবহার করতে পারেন :

var qs = require('querystring');

function (request, response) {
    if (request.method == 'POST') {
        var body = '';

        request.on('data', function (data) {
            body += data;

            // Too much POST data, kill the connection!
            // 1e6 === 1 * Math.pow(10, 6) === 1 * 1000000 ~~~ 1MB
            if (body.length > 1e6)
                request.connection.destroy();
        });

        request.on('end', function () {
            var post = qs.parse(body);
            // use post['blah'], etc.
        });
    }
}

এখন, উদাহরণস্বরূপ, যদি আপনার inputনামের সাথে কোনও ক্ষেত্র থাকে age, আপনি ভেরিয়েবলটি ব্যবহার করে এটি অ্যাক্সেস করতে পারেন post:

console.log(post.age);

8
@ তেজ এইচএম, এটি একটি ভাল বিষয়। এটি যুক্ত করা কঠিন হবে না, যদিও, তাই জিনিসগুলি সহজ রাখতে আমি উদাহরণের বাইরে রেখে যাব।
কেসি চু

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

4
var POST = qs.parse(body); // use POST কেবলমাত্র আমার মতো নুবসের জন্য: যখন ইনপুট পাঠ্য ক্ষেত্রের নাম "ব্যবহারকারী" হয়, তখন Post.userসেই ক্ষেত্রটির ডেটা প্রদর্শিত হবে। যেমনconsole.log(Post.user);
মাইকেল মোলার

5
আপনি readableবডি স্ট্রিংয়ে ডেটা তৈরির পরিবর্তে কলব্যাকও ব্যবহার করতে পারেন । একবার এটিকে বহিস্কার করা হলে, দেহটি পাওয়া যায়request.read();
টমাস ফাঙ্কাউজার

4
লক্ষ্য করুন যে req.connection.destroy(); কলব্যাকগুলি কার্যকর হতে বাধা দেয় না! উদাহরণস্বরূপ, "অন এন্ড" কলব্যাক কেটে যাওয়া শরীরের সাথে কার্যকর করা হবে! এটি সম্ভবত আপনি যা চান তা নয় ...
কলিমার্কো

149

যদি কেউ আপনার র‌্যাম বন্যার চেষ্টা করে তবে সংযোগটি নিশ্চিত করে ফেলুন!

var qs = require('querystring');

function (request, response) {
    if (request.method == 'POST') {
        var body = '';
        request.on('data', function (data) {
            body += data;
            // 1e6 === 1 * Math.pow(10, 6) === 1 * 1000000 ~~~ 1MB
            if (body.length > 1e6) { 
                // FLOOD ATTACK OR FAULTY CLIENT, NUKE REQUEST
                request.connection.destroy();
            }
        });
        request.on('end', function () {

            var POST = qs.parse(body);
            // use POST

        });
    }
}

53
আপনি এইচটিটিপি 413 ত্রুটি
কোডও

1
@ এসএসএইচ: না, এটি 1 * 10 ^ 6 = 1000000।
thejh

@ টিকি: এই ক্ষেত্রে, পোস্ট করুন [নাম] (যেমন পোস্ট করুন ["ফু" ")।
thejh

2
var POST = qs.parse(body); // use POST কেবল নুবসের জন্য: যখন ইনপুট পাঠ্যের ক্ষেত্রের নাম "ব্যবহারকারী" হয়, পোস্ট.ইউজারটি সেই ক্ষেত্রের ডেটা প্রদর্শন করবে। যেমন কনসোল.লগ (Post.user);
মাইকেল মোলার

2
কেউ সহায়তা করতে পারে, যদি আমি পোস্ট করি {'নাম': 'জো'} আমি পেয়েছি Name {'নাম': 'জো'}: ''} কিউএস. পার্সের পরে (পোস্ট) ...
ম্যাট ক্যান্টি

118

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

বুনিয়াদি

যখন http.createServer এর কলব্যাক বলা হয়, যখন সার্ভারটি অনুরোধের জন্য প্রকৃতপক্ষে সমস্ত শিরোনাম পেয়ে থাকে, তবে এটি সম্ভবত সম্ভব যে ডেটা এখনও প্রাপ্ত হয়নি, সুতরাং আমাদের এটির জন্য অপেক্ষা করতে হবে। HTTP অনুরোধ বস্তু (একটি http.IncomingMessage উদাহরণস্বরূপ) আসলে একটি হয় পাঠযোগ্য প্রবাহ । পাঠযোগ্য স্ট্রিমগুলিতে যখনই প্রচুর ডেটা আসে, একটি ইভেন্ট নির্গত হয় (ধরে নেওয়া যায় আপনি এটিতে একটি কলব্যাক নিবন্ধিত করেছেন) এবং যখন সমস্ত অংশ এসে পৌঁছেছে তখন একটি ইভেন্ট নির্গত হয়। আপনি কীভাবে ইভেন্টগুলি শোনেন তার একটি উদাহরণ এখানে:data end

http.createServer((request, response) => {
  console.log('Now we have a http message with headers but no data yet.');
  request.on('data', chunk => {
    console.log('A chunk of data has arrived: ', chunk);
  });
  request.on('end', () => {
    console.log('No more data');
  })
}).listen(8080)

বাফারদের স্ট্রিংয়ে রূপান্তর করা

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

বাফারিং অংশগুলি

এখন আপনি সম্ভবত প্রতিটি অংশের নিজস্ব দ্বারা আগ্রহী নন, তাই এই ক্ষেত্রে সম্ভবত আপনি এটি এটিকে বাফার করতে চান:

http.createServer((request, response) => {
  const chunks = [];
  request.on('data', chunk => chunks.push(chunk));
  request.on('end', () => {
    const data = Buffer.concat(chunks);
    console.log('Data: ', data);
  })
}).listen(8080)

এখানে বাফারকনক্যাট ব্যবহার করা হয়, যা কেবলমাত্র সমস্ত বাফারকে একত্রিত করে এবং একটি বড় বাফার ফিরিয়ে দেয়। আপনি কনক্যাট-স্ট্রিম মডিউলও ব্যবহার করতে পারেন যা একই কাজ করে:

const http = require('http');
const concat = require('concat-stream');
http.createServer((request, response) => {
  concat(request, data => {
    console.log('Data: ', data);
  });
}).listen(8080)

সামগ্রী পার্সিং করা হচ্ছে

আপনি HTML কোন ফাইল বা হস্তান্তর সহ একটি পোস্ট জমা ফর্ম গ্রহণ করার চেষ্টা করছেন যদি jQuery এর Ajax ডিফল্ট বিষয়বস্তুর প্রকার কল, তারপর বিষয়বস্তুর প্রকার হয় application/x-www-form-urlencodedসঙ্গে uft-8এনকোডিং। আপনি এটিকে ডি-সিরিয়ালাইজ করতে এবং বৈশিষ্ট্যগুলি অ্যাক্সেস করতে ক্যোরিস্ট্রিং মডিউলটি ব্যবহার করতে পারেন :

const http = require('http');
const concat = require('concat-stream');
const qs = require('querystring');
http.createServer((request, response) => {
  concat(request, buffer => {
    const data = qs.parse(buffer.toString());
    console.log('Data: ', data);
  });
}).listen(8080)

যদি আপনার বিষয়বস্তুর প্রকার তাদেরকে JSON পরিবর্তে, আপনি কেবল ব্যবহার করতে পারেন JSON.parse পরিবর্তে qs.parse

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

বংশীধ্বনিতুল্য

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

সুতরাং আপনি যদি কোনও ফাইলে বিষয়বস্তু সংরক্ষণ করতে চান:

 http.createServer((request, response) => {
   request.pipe(fs.createWriteStream('./request'));
 }).listen(8080)

ডেটা পরিমাণ সীমিত

অন্যান্য উত্তরের হিসাবে আমার মনে রাখা হয়েছে যে দূষিত ক্লায়েন্টরা আপনাকে আপনার অ্যাপ্লিকেশনটি ক্র্যাশ করতে বা আপনার স্মৃতি পূরণ করতে বিপুল পরিমাণ ডেটা প্রেরণ করতে পারে যাতে সুরক্ষা রাখতে যাতে কোনও নির্দিষ্ট সীমা অতিক্রম করে এমন ডেটা নির্গত করে এমন অনুরোধগুলি আপনি ফেলে দেন তা নিশ্চিত করে। যদি আপনি আগত ডেটাগুলি পরিচালনা করতে কোনও গ্রন্থাগার ব্যবহার না করেন। আমি স্ট্রিম-মিটারের মতো এমন কিছু ব্যবহার করার পরামর্শ দেব যা নির্দিষ্ট সীমাতে পৌঁছে গেলে অনুরোধটি বাতিল করতে পারে:

limitedStream = request.pipe(meter(1e7));
limitedStream.on('data', ...);
limitedStream.on('end', ...);

অথবা

request.pipe(meter(1e7)).pipe(createWriteStream(...));

অথবা

concat(request.pipe(meter(1e7)), ...);

এনপিএম মডিউলগুলি

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

আপনি যদি কোনও কাঠামো ব্যবহার না করেন তবে শরীরটি বেশ ভাল।


ধন্যবাদ, আমি আপনার কোড ব্যবহার করেছি এবং আমি রহস্যজনক সদৃশ বার্তা পেয়েছি। ভেরিয়েবলটি requestআবার ব্যবহার করা হয়েছে এবং request.on('end')একাধিকবার আহ্বান করা যেতে পারে? আমি কীভাবে এড়াতে পারি?
ইয়ান কিং ইয়িন

আপনার কোড না দেখে কেন বলতে পারছি না। মনে রাখবেন যে প্রতিটি অনুরোধের জন্য, কল করা request.on('end', ...)হবে।
ফরিদ নুরী নেশাত

এটি সম্ভবত আপনার কোডের সাথে সম্পর্কিত নয়, আমি সার্ভার-প্রেরিত ইভেন্টগুলি করছি এবং এটি ভুল করে ফেলেছি ... আপনার কোডটি
ইয়ান কিং ইয়িন

কোনও 'শেষ' হ্যান্ডলার ছাড়াই, অর্থাত্ বাফারিং ছাড়াই কোনও জিইটি অনুরোধ প্রক্রিয়াকরণের সাথে তুলনা করার সময় এই প্রভাব কীভাবে সম্পাদন করে?
JSON

1
এটি এখানে প্রশ্নের সেরা উত্তর। 🧐
montrealist

103

এখানে পোস্ট করা অন্যান্য উত্তর এবং নিবন্ধগুলির উপর ভিত্তি করে একটি খুব সাধারণ নং-ফ্রেমওয়ার্ক র‌্যাপার:

var http = require('http');
var querystring = require('querystring');

function processPost(request, response, callback) {
    var queryData = "";
    if(typeof callback !== 'function') return null;

    if(request.method == 'POST') {
        request.on('data', function(data) {
            queryData += data;
            if(queryData.length > 1e6) {
                queryData = "";
                response.writeHead(413, {'Content-Type': 'text/plain'}).end();
                request.connection.destroy();
            }
        });

        request.on('end', function() {
            request.post = querystring.parse(queryData);
            callback();
        });

    } else {
        response.writeHead(405, {'Content-Type': 'text/plain'});
        response.end();
    }
}

ব্যবহারের উদাহরণ:

http.createServer(function(request, response) {
    if(request.method == 'POST') {
        processPost(request, response, function() {
            console.log(request.post);
            // Use request.post here

            response.writeHead(200, "OK", {'Content-Type': 'text/plain'});
            response.end();
        });
    } else {
        response.writeHead(200, "OK", {'Content-Type': 'text/plain'});
        response.end();
    }

}).listen(8000);

এই চেকটি আলাদা মিডলওয়্যারে স্থানান্তরিত করা উচিত নয় যাতে এটি সমস্ত পোস্ট / রাখার অনুরোধগুলিতে খুব বড় অনুরোধগুলির জন্য পরীক্ষা করতে পারে
পাভেল নিকোলভ

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

.রেড () পদ্ধতি সম্পর্কে কি? এটি কি মডিউল দ্বারা সমর্থিত নয়? যেমন। প্রতিক্রিয়া.প্রেম ()
বিটি

আরে, কেবল কৌতূহলী - আপনি কেন অনুরোধের বস্তুর চেয়ে প্রতিক্রিয়া অবজেক্ট (রেসপন্স.পোস্ট) এ পেডলোড রেখেছেন?
জোথাম

@ জোথাম ভাল প্রশ্ন ... আমি কেন আগে তা লক্ষ্য করিনি সে সম্পর্কে আমার কোনও ধারণা নেই তবে এটি response.postআরও যুক্তিযুক্ত হওয়ার চেয়ে বেশি হওয়ার কারণ নেই request.post। আমি পোস্ট আপডেট।
মাহন

83

আপনি যদি JSON এ আপনার ডেটা এনকোড করে থাকেন তবে এটি পরিষ্কার হয়ে যাবে , তবে নোড.জেএস এ প্রেরণ করুন

function (req, res) {
    if (req.method == 'POST') {
        var jsonString = '';

        req.on('data', function (data) {
            jsonString += data;
        });

        req.on('end', function () {
            console.log(JSON.parse(jsonString));
        });
    }
}

1
এটিই আমার পক্ষে কাজ করেছিল। অন্যান্য সমাধানগুলি সক্রিয় করে এমন একটি স্ট্রিং ফিরিয়েছিল যা জেএসএনের মতো দেখায় তবে পার্স করা হয়নি। পরিবর্তে qs.parse(), JSON.parse()শরীরকে ব্যবহারযোগ্য কিছুতে পরিণত করে। উদাহরণ:, var post = JSON.parse(body);তারপরে ডেটা অ্যাক্সেস করুন post.fieldname। (গল্পটির নৈতিকতা, আপনি যা দেখছেন সে সম্পর্কে যদি আপনি বিভ্রান্ত হন তবে ভুলে যাবেন না typeof!)
wmassingham

12
ঠিক আছে, সচেতন হোন যে আপনাকে অবশ্যই JSON.parse ফাংশনটি ধরার চেষ্টা করতে হবে কারণ আমি যদি আপনার অ্যাপ্লিকেশনটি অসুস্থ করতে চাই তবে কেবল একটি কাঁচা পাঠ্য সহ একটি দেহ প্রেরণ করুন।
ecarrio

আপনার request.setEncodingএই কাজটি সঠিকভাবে করার জন্য ব্যবহার করা উচিত অন্যথায় এটি অসি অক্ষরগুলি সঠিকভাবে পরিচালনা করতে পারে না।
ফরিদ নুরি নেশাত

37

যে কোনও ওয়েব ফ্রেমওয়ার্ক ইনস্টল না করে কীভাবে এই তুচ্ছ কাজটি করবেন তা ভাবছেন আমি একসাথে এটিকে পরিচালনা করতে সক্ষম হয়েছি। খুব সম্ভবত উত্পাদন প্রস্তুত কিন্তু এটি কাজ করে বলে মনে হচ্ছে।

function handler(req, res) {
    var POST = {};
    if (req.method == 'POST') {
        req.on('data', function(data) {
            data = data.toString();
            data = data.split('&');
            for (var i = 0; i < data.length; i++) {
                var _data = data[i].split("=");
                POST[_data[0]] = _data[1];
            }
            console.log(POST);
        })
    }
}

অবশেষে এই অদ্ভুত সমস্যার জন্য একটি পরিশ্রমী সমাধান..এরপরে উত্তরটি কলব্যাক শুরু হওয়ার পরে কেন অনুরোধের অভ্যন্তরে কোনও ডেটা ছিল না তা বুঝতে অনেক সহায়তা করেছিল .. অনেক ধন্যবাদ!
luis-br

3
1) এই উত্তরটি ধরে নেয় ডেটা একটি স্ট্রিং। খারাপ ধারণা, একটি সাধারণ ক্ষেত্রে। ২) এই উত্তরটি ধরে নিয়েছে যে ডেটাগুলি একটি অংশে আসে। অন্যথায়, '=' দ্বারা বিভাজক অনাকাঙ্ক্ষিত ফলাফল দেবে। খারাপ ধারণা, একটি সাধারণ ক্ষেত্রে।
কনস্ট্যান্টিন

@ কনস্ট্যান্টিন প্রকৃতপক্ষে এই উত্তরটি ধরে নেয় ডেটা বাফার। এটা দেখ. stackoverflow.com/questions/14551194/… এটিওmillermedeiros.github.io/mdoc/example/node_api/doc/…
শ্যান হুইনারি

16

আপনি ব্যবহার করতে পারেন body-parser, নোড.জেএস বডি পার্সিং মিডওয়্যার।

প্রথম বোঝা body-parser

$ npm install body-parser --save

কিছু উদাহরণ কোড

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

var app = express()

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


app.use(function (req, res) {
  var post_data = req.body;
  console.log(post_data);
})

আরও ডকুমেন্টেশন এখানে পাওয়া যাবে



9

আপনি যদি নোড-মজবুত ব্যবহার করেন তবে আপনি এটি কীভাবে করতে পারেন তা এখানে :

var formidable = require("formidable");

var form = new formidable.IncomingForm();
form.parse(request, function (err, fields) {
    console.log(fields.parameter1);
    console.log(fields.parameter2);
    // ...
});

আমি যখন পাথ বা পথ + নামটি lwip.open (পথ বা পথ + নাম + সহ অকার্যকর চিত্র হিসাবে একটি ত্রুটি পেয়েছি) দিয়ে ফাইল অ্যাক্সেস করতে চেষ্টা করি তখন আমি সেই পথটিতে সমস্যা সৃষ্টি করছি
Lion789

7

আপনি যদি খাঁটি নোড.জেএস ব্যবহার করতে পছন্দ করেন তবে আপনি নীচের মত পোষ্ট ডেটা বের করতে পারেন:

// Dependencies
const StringDecoder = require('string_decoder').StringDecoder;
const http = require('http');

// Instantiate the HTTP server.
const httpServer = http.createServer((request, response) => {
  // Get the payload, if any.
  const decoder = new StringDecoder('utf-8');
  let payload = '';

  request.on('data', (data) => {
    payload += decoder.write(data);
  });

  request.on('end', () => {
    payload += decoder.end();

    // Parse payload to object.
    payload = JSON.parse(payload);

    // Do smoething with the payload....
  });
};

// Start the HTTP server.
const port = 3000;
httpServer.listen(port, () => {
  console.log(`The server is listening on port ${port}`);
});


6

1) 'body-parser'এনপিএম থেকে ইনস্টল করুন ।

2) তারপরে আপনার app.ts এ

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

3) তারপরে আপনার লিখতে হবে

app.use(bodyParser.json())

মধ্যে app.ts মডিউল

4) মনে রাখবেন যে আপনি অন্তর্ভুক্ত

app.use(bodyParser.json())

শীর্ষে বা কোনও মডিউল ঘোষণার আগে।

উদা:

app.use(bodyParser.json())
app.use('/user',user);

5) তারপরে ব্যবহার করুন

var postdata = req.body;

5

যদি আপনি dataকলব্যাকের সাথে আপনার ডেটা একসাথে না করতে চান তবে আপনি সর্বদা এইভাবে readableকলব্যাক ব্যবহার করতে পারেন :

// Read Body when Available
request.on("readable", function(){
  request.body = '';
  while (null !== (request.body += request.read())){}
});

// Do something with it
request.on("end", function(){
  request.body //-> POST Parameters as String
});

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

আপনি যদি বিশাল দেহকে ভয় পান তবে প্রথমে শরীরের আকার পরীক্ষা করা একটি উন্নত পদ্ধতির উপায়।


এটি করার সুবিধাজনক উপায়, তবে আপনি কীভাবে "দেহের আকারটি প্রথমে পরীক্ষা করবেন" এমনভাবে যা দূষিত অনুরোধের দ্বারা বোকা বানানো যায় না?
doug65536

requestএকটি সাধারণ নোড.জেএস স্ট্রিম, যাতে আপনি request.headersশরীরের দৈর্ঘ্য পরীক্ষা করতে পারেন এবং প্রয়োজনে অনুরোধটি বাতিল করতে পারেন।
টমাস ফানখাউজার

1
@ থমাস ফাঙ্কহাউসার শিরোনামের দেহের দৈর্ঘ্য সঠিক মান বা এমনকি উপস্থিত নাও হতে পারে। এটি করার সঠিক উপায়, দেহটি আসার সাথে সাথে আপনি এটি বাফার করছেন, এটি সীমাটি অতিক্রম করবে না তা নিশ্চিত করার জন্য আপনি আকারটি পরীক্ষা করেন।
ফরিদ নুরি নেশাত

4

এটি করার একাধিক উপায় রয়েছে। তবে, আমি জানি দ্রুততম উপায় হ'ল এক্সপ্রেস.জেএস লাইব্রেরিটি বডি পার্সার সহ ব্যবহার করা।

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

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

app.post("/pathpostdataissentto", function(request, response) {
  console.log(request.body);
  //Or
  console.log(request.body.fieldName);
});

app.listen(8080);

এটি স্ট্রিংয়ের জন্য কাজ করতে পারে তবে পোস্টের ডেটাতে জেএসএন অ্যারে থাকলে আমি তার পরিবর্তে বডি পার্সার.উরলিনকোডটি বডি পার্সার.জসনে পরিবর্তন করব।

আরও তথ্য: http://www.kompulsa.com/how-to-accept-and-parse-post-requests-in-node-js/


4

আপনাকে POSTব্যবহার করে খণ্ডে ডেটা গ্রহণ করতে হবেrequest.on('data', function(chunk) {...})

const http = require('http');

http.createServer((req, res) => {
    if (req.method == 'POST') {
        whole = ''
        req.on('data', (chunk) => {
            # consider adding size limit here
            whole += chunk.toString()
        })

        req.on('end', () => {
            console.log(whole)
            res.writeHead(200, 'OK', {'Content-Type': 'text/html'})
            res.end('Data received.')
        })
    }
}).listen(8080)

আপনার প্রস্তাবিত স্থানে একটি আকার সীমা যুক্ত করার কথা বিবেচনা করা উচিত ।


এটি কি আরও ধীর-লরিসের আক্রমণে সংবেদনশীল?

নোডেজগুলি ধীর-লরিসের তুলনায় কম সংবেদনশীল যেমন, পিএইচপি - কারণ এটি প্রতিটি http সংযোগের চারপাশে বড় সেশন অবজেক্ট তৈরি করে না। তবে, মনে হচ্ছে এই কোডটি এখনও একটি ধীর-লরিস দুর্বলতার পরিচয় দিতে পারে। setTimeoutপুরো উইন্ডোটি যদি সেই উইন্ডোর মধ্যে না পাওয়া যায় তবে নির্দিষ্ট সময়ের পরে সংযোগ শেষ করে এমনটি দিয়ে এটি প্রতিরোধ করা যেতে পারে ।
গের্শোন


3

আপনি যদি এক্সপ্রেস.জেএস ব্যবহার করে থাকেন, আপনি রেইকি.এডিতে অ্যাক্সেস করার আগে, আপনাকে অবশ্যই মিডলওয়্যার বডি পার্সার যুক্ত করতে হবে:

app.use(express.bodyParser());

তাহলে আপনি চাইতে পারেন

req.body.user

বেশিরভাগ মিডলওয়্যার (বডি পার্সারের মতো) আর এক্সপ্রেসের সাথে বান্ডিল হয় না এবং পৃথকভাবে ইনস্টল করা উচিত। আরও বর্তমান উত্তরের জন্য উপরের @ নিকোডিয়ান 2 থেকে উত্তরটি দেখুন
জেফ কলিয়ার

app.use (bodyParser ()); কাজ করে তবে আমাকে অবমূল্যায়ন লাল ত্রুটির বার্তা দিচ্ছে
ক্রিস অলিনসন

2

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

এটি নোড.জেএস মডিউলগুলিতে তালিকাভুক্ত


1

আমি একটি ভিডিও পেয়েছি যা এটি কীভাবে অর্জন করতে হবে তার ব্যাখ্যা করে: https://www.youtube.com/watch?v=nuw48-u3Yrg

এটি "ক্যোরিস্ট্রিং" এবং "স্ট্রিংবিল্ডার" মডিউলগুলির সাথে একসাথে ডিফল্ট "HTTP" মডিউল ব্যবহার করে। অ্যাপ্লিকেশনটি একটি ওয়েব পৃষ্ঠা থেকে দুটি সংখ্যা (দুটি পাঠ্যবক্স ব্যবহার করে) নেয় এবং জমা দেওয়ার পরে, এই দুটিটির যোগফল দেয় (পাঠ্য বাক্সগুলিতে মানগুলি বজায় রাখার পাশাপাশি)। এটি আমি যে কোনও জায়গায় খুঁজে পেতে পারি এটি সেরা উদাহরণ।

সম্পর্কিত উত্স কোড:

var http = require("http");
var qs = require("querystring");
var StringBuilder = require("stringbuilder");

var port = 9000;

function getCalcHtml(req, resp, data) {
    var sb = new StringBuilder({ newline: "\r\n" });
    sb.appendLine("<html>");
    sb.appendLine(" <body>");
    sb.appendLine("     <form method='post'>");
    sb.appendLine("         <table>");
    sb.appendLine("             <tr>");
    sb.appendLine("                 <td>Enter First No: </td>");

    if (data && data.txtFirstNo) {
        sb.appendLine("                 <td><input type='text' id='txtFirstNo' name='txtFirstNo' value='{0}'/></td>", data.txtFirstNo);
    }
    else {
        sb.appendLine("                 <td><input type='text' id='txtFirstNo' name='txtFirstNo' /></td>");
    }

    sb.appendLine("             </tr>");
    sb.appendLine("             <tr>");
    sb.appendLine("                 <td>Enter Second No: </td>");

    if (data && data.txtSecondNo) {
        sb.appendLine("                 <td><input type='text' id='txtSecondNo' name='txtSecondNo' value='{0}'/></td>", data.txtSecondNo);
    }
    else {
        sb.appendLine("                 <td><input type='text' id='txtSecondNo' name='txtSecondNo' /></td>");
    }

    sb.appendLine("             </tr>");
    sb.appendLine("             <tr>");
    sb.appendLine("                 <td><input type='submit' value='Calculate' /></td>");
    sb.appendLine("             </tr>");

    if (data && data.txtFirstNo && data.txtSecondNo) {
        var sum = parseInt(data.txtFirstNo) + parseInt(data.txtSecondNo);
        sb.appendLine("             <tr>");
        sb.appendLine("                 <td>Sum: {0}</td>", sum);
        sb.appendLine("             </tr>");
    }

    sb.appendLine("         </table>");
    sb.appendLine("     </form>")
    sb.appendLine(" </body>");
    sb.appendLine("</html>");
    sb.build(function (err, result) {
        resp.write(result);
        resp.end();
    });
}

function getCalcForm(req, resp, data) {
    resp.writeHead(200, { "Content-Type": "text/html" });
    getCalcHtml(req, resp, data);
}

function getHome(req, resp) {
    resp.writeHead(200, { "Content-Type": "text/html" });
    resp.write("<html><html><head><title>Home</title></head><body>Want to some calculation? Click <a href='/calc'>here</a></body></html>");
    resp.end();
}

function get404(req, resp) {
    resp.writeHead(404, "Resource Not Found", { "Content-Type": "text/html" });
    resp.write("<html><html><head><title>404</title></head><body>404: Resource not found. Go to <a href='/'>Home</a></body></html>");
    resp.end();
}

function get405(req, resp) {
    resp.writeHead(405, "Method not supported", { "Content-Type": "text/html" });
    resp.write("<html><html><head><title>405</title></head><body>405: Method not supported</body></html>");
    resp.end();
}

http.createServer(function (req, resp) {
    switch (req.method) {
        case "GET":
            if (req.url === "/") {
                getHome(req, resp);
            }
            else if (req.url === "/calc") {
                getCalcForm(req, resp);
            }
            else {
                get404(req, resp);
            }
            break;
        case "POST":
            if (req.url === "/calc") {
                var reqBody = '';
                req.on('data', function (data) {
                    reqBody += data;
                    if (reqBody.length > 1e7) { //10MB
                        resp.writeHead(413, 'Request Entity Too Large', { 'Content-Type': 'text/html' });
                        resp.end('<!doctype html><html><head><title>413</title></head><body>413: Request Entity Too Large</body></html>');
                    }
                });
                req.on('end', function () {
                    var formData = qs.parse(reqBody);
                    getCalcForm(req, resp, formData);
                });
            }
            else {
                get404(req, resp);
            }
            break;
        default:
            get405(req, resp);
            break;
    }
}).listen(port);

1

যারা কাঁচা বাইনারি পোষ্ট ব্যবহার করছেন তাদের ওভারহেড এনকোডিং ছাড়াই আপলোড করতে পারেন:

ক্লায়েন্ট:

var xhr = new XMLHttpRequest();
xhr.open("POST", "/api/upload", true);
var blob = new Uint8Array([65,72,79,74]); // or e.g. recorder.getBlob()
xhr.send(blob);

সার্ভার:

var express = require('express');
var router = express.Router();
var fs = require('fs');

router.use (function(req, res, next) {
  var data='';
  req.setEncoding('binary');
  req.on('data', function(chunk) {
    data += chunk;
  });

  req.on('end', function() {
    req.body = data;
    next();
  });
});

router.post('/api/upload', function(req, res, next) {
  fs.writeFile("binaryFile.png", req.body, 'binary', function(err) {
    res.send("Binary POST successful!");
  });
});

1

আপনি এক্সপ্রেস মিডলওয়্যারটি ব্যবহার করতে পারেন , এতে এখন বডি পার্সার অন্তর্নির্মিত রয়েছে। এর অর্থ আপনাকে যা করতে হবে তা হ'ল:

import express from 'express'

const app = express()

app.use(express.json())

app.post('/thing', (req, res) => {
  console.log(req.body) // <-- this will access the body of the post
  res.sendStatus(200)
})

কোড কোডটি এক্সপ্রেস 4.16.x সহ ES6


0

আপনি এক্সপ্রেস ব্যবহার না করে পোস্ট প্যারামিটার বের করতে পারেন।

1: nmp install multiparty

2: মাল্টিপার্টি আমদানি করুন। যেমনvar multiparty = require('multiparty');

3: `

if(req.method ==='POST'){
   var form = new multiparty.Form();
   form.parse(req, function(err, fields, files) {
      console.log(fields['userfile1'][0]);
    });
    }

4: এবং এইচটিএমএল ফর্ম IS।

<form method=POST enctype=multipart/form-data>
<input type=text name=userfile1><br>
<input type=submit>
</form>

আমি আশা করি এটি আপনার পক্ষে কাজ করবে। ধন্যবাদ।


0

আপনার নোড অ্যাপ্লিকেশনটিকে বন্যার এড়ানোর জন্য POST আকার সীমাবদ্ধ করুন। একটি দুর্দান্ত কাঁচা বডি মডিউল রয়েছে, যা এক্সপ্রেস এবং সংযোগ উভয়ের জন্যই উপযুক্ত, যা আপনাকে আকার এবং দৈর্ঘ্যের দ্বারা অনুরোধ সীমাবদ্ধ করতে সহায়তা করতে পারে।


0

এটিতে কোনও ফাইল আপলোড জড়িত থাকলে ব্রাউজারটি সাধারণত এটি একটি "multipart/form-data"সামগ্রী-প্রকার হিসাবে প্রেরণ করে । আপনি এ জাতীয় ক্ষেত্রে এটি ব্যবহার করতে পারেন

var multipart = require('multipart');
multipart.parse(req)

রেফারেন্স 1

রেফারেন্স 2


0

এই মত ফর্ম ক্ষেত্রে

   <input type="text" name="user[name]" value="MyName">
   <input type="text" name="user[email]" value="myemail@somewherefarfar.com">

উপরের উত্তরগুলির মধ্যে কিছু ব্যর্থ হবে কারণ তারা কেবল ফ্ল্যাট ডেটা সমর্থন করে।

এখন আমি ক্যাসি চু উত্তর ব্যবহার করছি কিন্তু সঙ্গে "QS" পরিবর্তে "querystring" মডিউল। এটি "বডি পার্সার" মডিউলটিও ব্যবহার করে। সুতরাং যদি আপনি নেস্টেড ডেটা চান তবে আপনাকে কিউএস ইনস্টল করতে হবে।

npm install qs --save

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

//var qs = require('querystring');
var qs = require('qs'); 

function (request, response) {
    if (request.method == 'POST') {
        var body = '';

        request.on('data', function (data) {
            body += data;

            // Too much POST data, kill the connection!
            // 1e6 === 1 * Math.pow(10, 6) === 1 * 1000000 ~~~ 1MB
            if (body.length > 1e6)
                request.connection.destroy();
        });

        request.on('end', function () {
            var post = qs.parse(body);
            console.log(post.user.name); // should work
            // use post['blah'], etc.
        });
    }
}

0

আপনি "অনুরোধ - সরলীকৃত এইচটিটিপি ক্লায়েন্ট" এবং জাভাস্ক্রিপ্ট প্রতিশ্রুতি ব্যবহার করে সহজেই পোস্টের অনুরোধের প্রতিক্রিয়া প্রেরণ এবং পেতে পারেন।

var request = require('request');

function getData() {
    var options = {
        url: 'https://example.com',
        headers: {
            'Content-Type': 'application/json'
        }
    };

    return new Promise(function (resolve, reject) {
        var responseData;
        var req = request.post(options, (err, res, body) => {
            if (err) {
                console.log(err);
                reject(err);
            } else {
                console.log("Responce Data", JSON.parse(body));
                responseData = body;
                resolve(responseData);
            }
        });
    });
}

0

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

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

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

............................................................।

var loginDetails = {

username : request.body.username,

password : request.body.password

};

0

মিডলওয়ার ছাড়া একটি লাইন
আপনি নীচের ডেটা পোস্ট করলে আপনি
'name':'ABC'
নীচের একটি লাইনার ব্যবহার করে পার্স করতে পারেন,

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