我正在尝试在下一个代码中运行子进程:
run = function (cmd, callback) {
var spawn = require('child_process').spawn;
var command = spawn(cmd);
var result = '';
command.stdout.on('data', function (data) {
result += data.toString();
});
command.on('exit', function () {
callback(result);
});
}
execQuery = function (cmd) {
var result = {
errnum: 0,
error: 'No errors.',
body: ''
};
run(cmd, function (message) {
result.body = message;
console.log(message);
});
return result;
}
执行execQuery(' ls') result.body 始终为空,但 console.log 包含值。
答案 0 :(得分:1)
我运行了一个快速测试,命令的exit
事件在所有stdout
数据耗尽之前就开始了。如果我更改exit
处理程序以查找command.stdout
的{{1}}事件,我至少会抓取并打印输出。
end
这应该有所帮助。请注意,您可能希望使用现有的库,并且真正正确的实现将比您拥有的更复杂,但我的更改应该解决您当前的包版问题。
随机提示:始终为错误保留回调函数的第一个参数是节点约定,并且您的代码段与该约定不一致。您可能应该调整以匹配约定。
对不起,让我谈谈你关于command.stdout.on('end', function () {
callback(result);
});
的问题。 result.body
函数是异步的!这意味着您的run
代码行会在return result;
所在的run
回调主体之前执行。当您涉及I / O时,不能在节点中的任何位置使用类似返回值。你必须使用回调。