Tôi vẫn đang cố gắng nắm bắt những điểm tốt hơn về cách tôi có thể chạy lệnh shell linux hoặc windows và nắm bắt đầu ra trong node.js; cuối cùng, tôi muốn làm một cái gì đó như thế này ...
//pseudocode
output = run_command(cmd, args)
Phần quan trọng là output
phải có sẵn cho một biến (hoặc đối tượng) có phạm vi toàn cục. Tôi đã thử chức năng sau, nhưng vì lý do nào đó, tôi được undefined
in ra bảng điều khiển ...
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" <------
Tôi đang gặp khó khăn khi hiểu đoạn mã ở trên bị ngắt ở đâu ... một nguyên mẫu rất đơn giản của mô hình đó hoạt động ...
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" <----
Ai đó có thể giúp tôi hiểu tại sao try_this()
hoạt động và run_cmd()
không? FWIW, tôi cần sử dụng child_process.spawn
, vì child_process.exec
có giới hạn bộ đệm 200KB.
Giải quyết cuối cùng
Tôi chấp nhận câu trả lời của James White, nhưng đây là mã chính xác phù hợp với tôi ...
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 = "";
trongcmd_exec()
để ngăn chặn concatenatingundefined
đến đầu của kết quả.