নোড চাইল্ড_প্রসেস ব্যবহার করে স্ট্যাডআউট বাফার ইস্যু


92

আমি একটি স্থানীয় নেটওয়ার্কের একটি ভাগ করা ফোল্ডার থেকে একটি JSON ফাইল (প্রায় 220Ko) পেতে নোড চাইল্ড_প্রসেস ব্যবহার করে কার্ল চালানোর চেষ্টা করছি। তবে এটি আসলে একটি বাফার সমস্যাটি ফিরিয়ে দেয় যা আমি সফল করতে পারি না। আমার কোডটি এখানে:

var exec = require('child_process').exec;

var execute = function(command, callback){
    exec(command, function(error, stdout, stderr){ callback(error, stdout); });
};

execute("curl http://" + ip + "/file.json", function(err, json, outerr) {
    if(err) throw err;
    console.log(json);
})

এবং এখানে আমি পেয়েছি ত্রুটি:

if(err) throw err;
          ^
Error: stdout maxBuffer exceeded.
    at Socket.<anonymous> (child_process.js:678:13)
    at Socket.EventEmitter.emit (events.js:95:17)
    at Socket.<anonymous> (_stream_readable.js:746:14)
    at Socket.EventEmitter.emit (events.js:92:17)
    at emitReadable_ (_stream_readable.js:408:10)
    at emitReadable (_stream_readable.js:404:5)
    at readableAddChunk (_stream_readable.js:165:9)
    at Socket.Readable.push (_stream_readable.js:127:10)
    at Pipe.onread (net.js:526:21)

উত্তর:


161

ব্যবহার করার সময় আপনাকে maxBufferবিকল্পটি সেট এবং সেট করতে হবে child_process.execডকুমেন্টেশন থেকে :

maxBuffer stdout বা stderr এ অনুমোদিত ডেটা সর্বাধিক পরিমাণ নির্দিষ্ট করে - যদি এই মানটি অতিক্রম করে তবে শিশু প্রক্রিয়াটি মারা যায়।

ডকুমেন্টেশনে আরও বলা হয়েছে যে এর ডিফল্ট মান maxBuffer200KB।

উদাহরণস্বরূপ, নিম্নলিখিত কোডটিতে সর্বাধিক বাফার আকার 500 কেবিতে বাড়ানো হয়েছে:

var execute = function(command, callback){
    exec(command, {maxBuffer: 1024 * 500}, function(error, stdout, stderr){ callback(error, stdout); });
};

এছাড়াও, আপনি http.getযা করতে চেষ্টা করছেন তা অর্জন করতে এটি সক্ষম কিনা তা জানতে আপনি পড়তে চাইতে পারেন।


এটি আমার সমস্যার সমাধান করেছে, ধন্যবাদ! ভাগ করা ফোল্ডারটি আসলে ওয়েবডাভ প্রোটোকলের অধীনে যার ডাইজেস্ট প্রমাণীকরণের প্রয়োজন হয়, এজন্য আমি কার্ল ব্যবহার করছি যা এটি খুব সহজেই পরিচালনা করেcurl --digest http://login:password@" + ip + "/webdav/file.json
ইয়োনলেড

এই ডিফল্টটি হাস্যকরভাবে ছোট। এইবার দ্বিতীয়বারের মতো আমাকে হার্ড-টু-ফাইন্ডে কামড়ানো হয়েছিল।
jlh

4
ডিফল্টটি এখন 1MB @jlh, nodejs.org/api/…
কার্লোস

57

আমার একই রকম সমস্যা ছিল এবং আমি এটি নির্বাহী থেকে অদৃশ্য হয়ে সরানো স্থির করেছিলাম:

var child = process.spawn('<process>', [<arg1>, <arg2>]);

child.stdout.on('data', function (data) {
  console.log('stdout: ' + data);
});

child.stderr.on('data', function (data) {
  console.log('stderr: ' + data);
});

child.on('close', function (code) {
    console.log('child process exited with code ' + code);
});


10
এটি
উভয়ের

4
এই উত্তরটি সবচেয়ে উপযুক্ত উত্তর অগত্যা নয়। আমি মনে করি প্রশ্নের কনসোল আউটপুট কেবল একটি উদাহরণ হতে পারে। কনসোল এ ছুঁড়ে ফেলার জন্য কেউ খুব দ্রুত 200 কেবি ফাইল আনবে। তবে, যদি process.execসিএলআই সরঞ্জামগুলির মতো জিনিসগুলিতে ব্যবহৃত হয় তবে হ্যাঁ, স্যুইচিংয়ের উপায় spawnহওয়া উচিত।
পাভেল গাতিলভ

4
বাহ ... ভোর শীতল। এটি এমনকি কল ব্যাক বা প্রতিশ্রুতি ব্যবহার করে না ... কেবল ইভেন্টগুলি। কনসোলে স্টাডাউট স্ট্রিমিংয়ের জন্য এটি সত্যই কার্যকর হতে পারে। @ পাভেল গাতিলোভ, আমরা ঠিক তাই করছি। এফএফএমপেইগ প্রতি সেকেন্ডে অগ্রগতি দেখাতে পছন্দ করে ... যা বাফারে টোল নেয়
রায় ফস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.