Linux 또는 Windows 셸 명령을 실행하고 node.js 내에서 출력을 캡처 할 수있는 방법에 대한 세부 사항을 여전히 파악하려고합니다. 궁극적으로 이렇게하고 싶습니다 ...
//pseudocode
output = run_command(cmd, args)
중요한 부분은 output
전역 범위 변수 (또는 개체)에서 사용할 수 있어야한다는 것입니다. 다음 기능을 시도했지만 어떤 이유로 undefined
콘솔에 인쇄됩니다 ...
function run_cmd(cmd, args, cb) {
var spawn = require('child_process').spawn
var child = spawn(cmd, args);
var me = this;
child.stdout.on('data', function(me, data) {
cb(me, data);
});
}
foo = new run_cmd('dir', ['/B'], function (me, data){me.stdout=data;});
console.log(foo.stdout); // yields "undefined" <------
위의 코드가 어디에서 깨지는 지 이해하는 데 어려움이 있습니다 ... 그 모델의 매우 간단한 프로토 타입이 작동합니다 ...
function try_this(cmd, cb) {
var me = this;
cb(me, cmd)
}
bar = new try_this('guacamole', function (me, cmd){me.output=cmd;})
console.log(bar.output); // yields "guacamole" <----
누군가가 왜 try_this()
작동하고 run_cmd()
작동하지 않는지 이해하도록 도울 수 있습니까 ? FWIW, 200KB 버퍼 제한이 child_process.spawn
있기 child_process.exec
때문에을 사용해야 합니다.
최종 해결책
나는 James White의 대답을 받아들이고 있지만 이것은 나를 위해 일한 정확한 코드입니다 ...
function cmd_exec(cmd, args, cb_stdout, cb_end) {
var spawn = require('child_process').spawn,
child = spawn(cmd, args),
me = this;
me.exit = 0; // Send a cb to set 1 when cmd exits
me.stdout = "";
child.stdout.on('data', function (data) { cb_stdout(me, data) });
child.stdout.on('end', function () { cb_end(me) });
}
foo = new cmd_exec('netstat', ['-rn'],
function (me, data) {me.stdout += data.toString();},
function (me) {me.exit = 1;}
);
function log_console() {
console.log(foo.stdout);
}
setTimeout(
// wait 0.25 seconds and print the output
log_console,
250);
me.stdout = "";
에cmd_exec()
합치 방지하기 위해undefined
결과의 시작.