नोड बच्चा_प्रोसेस का उपयोग करके स्टडआउट बफर समस्या


91

मैं एक स्थानीय नेटवर्क में एक साझा फ़ोल्डर से JSON फ़ाइल (लगभग 220Ko) प्राप्त करने के लिए नोड child_process का उपयोग करके कर्ल निष्पादित करने का प्रयास कर रहा हूं। लेकिन यह वास्तव में एक बफर समस्या देता है जिसे मैं नहीं समझ सकता। यहाँ मेरा कोड है:

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 पर अनुमत डेटा की सबसे बड़ी मात्रा को निर्दिष्ट करता है - यदि यह मान पार हो जाता है तो बच्चे की प्रक्रिया को मार दिया जाता है।

प्रलेखन में यह भी कहा गया है कि डिफ़ॉल्ट मान maxBuffer 200KB है।

उदाहरण के लिए, निम्न कोड में अधिकतम बफर आकार 500KB तक बढ़ाया जाता है:

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

इसके अतिरिक्त, आप http.getयह देखने के बारे में पढ़ना चाह सकते हैं कि क्या यह प्राप्त करने में सक्षम है कि आप क्या करने की कोशिश कर रहे हैं।


इससे मेरी समस्या हल हो गई, धन्यवाद! साझा किए गए फ़ोल्डर WebDAV प्रोटोकॉल है कि एक को पचाने प्रमाणीकरण की आवश्यकता है, तो इस कारण मैं कर्ल जो इसके साथ बहुत आसानी से संभालती उपयोग कर रहा हूँ के तहत वास्तव में हैcurl --digest http://login:password@" + ip + "/webdav/file.json
Yonnaled

यह डिफ़ॉल्ट हास्यास्पद रूप से छोटा है। यह दूसरी बार है जब मुझे इस तरह से एक कठिन तरीके से काट लिया गया था।
jlh

3
डिफ़ॉल्ट अब 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
यह दो का सबसे उपयुक्त समाधान लगता है
हैशब्रोवन

1
यह उत्तर सबसे उपयुक्त नहीं है। मुझे लगता है कि प्रश्न में कंसोल आउटपुट सिर्फ एक उदाहरण हो सकता है। शायद ही कोई 200KB फाइल को सांत्वना देने के लिए फेंकेगा। हालांकि, अगर process.execसीएलआई उपकरण जैसी चीजों में उपयोग किया जाता है, तो हां, स्विचिंग को spawnजाने का रास्ता होना चाहिए।
पावेल गातिलोव

1
वाह ... स्पॉन मस्त है। यह केवल कॉल बैक या वादों का उपयोग नहीं कर रहा है ... सिर्फ घटनाएँ। यह कंसोल के लिए स्टडआउट स्ट्रीमिंग के लिए वास्तव में उपयोगी हो सकता है। @ पावेल गैटिलोव, ठीक यही हम कर रहे हैं। FFMpeg को हर सेकंड प्रगति दिखाना पसंद है ... जो बफर पर एक टोल लेता है
रे फॉस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.