2014-05-02 9 views
42

Sto cercando di eseguire il ricciolo utilizzando il nodo child_process per ottenere un file JSON (circa 220Ko) da una cartella condivisa in una rete locale. Ma in realtà restituisce un problema di buffer che non riesco a ottenere attraverso. Ecco il mio codice:Problema del buffer di stdout utilizzando il nodo 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); 
}) 

E qui è l'errore che ottengo:

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) 

risposta

85

È necessario utilizzare e impostare l'opzione maxBuffer quando si utilizza child_process.exec. Dal documentation:

maxBuffer specifica la più grande quantità di dati accettati stdout o stderr - se questo valore viene superato, allora il processo figlio viene ucciso.

La documentazione indica inoltre che il valore predefinito di maxBuffer è 200 KB.

A titolo di esempio, la dimensione massima del buffer è aumentato a 500 KB nel codice seguente:

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

Inoltre, si consiglia di leggere su http.get per vedere se è in grado di realizzare ciò che si sta cercando di fare.

+0

Questo risolto il mio problema, grazie! La cartella condivisa è in realtà sotto il protocollo webdav che richiede un'autenticazione digest, ecco perché sto usando curl che lo gestisce molto facilmente con 'curl --digest http: // login: password @" ip + "/ webdav/file. json' – Yonnaled

+0

davvero bello funziona bene –

22

Ho avuto un problema simile e ho fissato in movimento da exec per deporre le uova:

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

Questo sembra essere il [più appropriato] (http://www.hacksparrow.com/difference-between-spawn -e-exec-of-node-js-child_process.html) soluzione dei due – Hashbrown

Problemi correlati