2014-05-02 37 views
42

我試圖執行curl使用節點child_process從本地網絡中的共享文件夾中獲取JSON文件(約220Ko)。但它實際上返回了我無法完成的緩衝區問題。 這裏是我的代碼:使用節點child_process stdout緩衝區問題

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) 

回答

85

您需要使用child_process.exec時使用,並設置maxBuffer選項。從documentation

maxBuffer指定允許在標準輸出或標準錯誤數據量最大的 - 如果超過此值,則子進程被殺死。

該文檔還指出,默認值maxBuffer是200KB。

舉例來說,最大緩衝區大小增加到500KB以下代碼:

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

此外,您可能想閱讀有關http.get,看它是否能夠達到你所想要的做。

+0

這解決了我的問題,謝謝!共享文件夾實際上是在webdav協議下,需要一個摘要式身份驗證,這就是爲什麼我使用curl,可以很容易地使用curl --digest http:// login:password @「+ ip +」/ webdav/file來處理它。 json' – Yonnaled

+0

真的很好它工作正常 –

22

我也有類似的問題,我固定它從EXEC移動產卵:

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

https://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options – cs01

+3

這似乎是[最合適](http://www.hacksparrow.com/difference-between-spawn -and-exec-of-node-js-child_process.html)解決方案 – Hashbrown