【问题标题】:Retrieve stdout to variable将标准输出检索到变量
【发布时间】:2013-05-29 03:51:01
【问题描述】:

我正在尝试在下一个代码中运行子进程:

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 是包含值。

【问题讨论】:

    标签: node.js variables process stdout output


    【解决方案1】:

    我进行了快速测试,命令的exit 事件在stdouts 的所有数据耗尽之前触发。如果我将您的exit 处理程序更改为查找command.stdoutend 事件,我至少可以捕获并打印输出。

    command.stdout.on('end', function () {
        callback(result);
    });
    

    这应该会有所帮助。请注意,您可能想要为此使用现有的库,并且真正正确的实现比您拥有的要复杂得多,但我的更改应该可以解决您当前的障碍问题。

    随机提示:节点约定总是为错误保留回调函数的第一个参数,而您的 sn-p 与该约定不一致。您可能应该调整以符合惯例。

    哦,抱歉,让我来解决您关于 result.body 的问题。 run 函数是异步的!这意味着您的return result; 代码行在result.body = message; 所在的run 回调主体之前执行。当您涉及 I/O 时,您不能在节点中的任何地方使用这样的返回值。你必须使用回调。

    【讨论】:

    • 同样的情况:stdout在回调函数中通过console.log接收,但是result.body在闭包外是空的。
    猜你喜欢
    • 1970-01-01
    • 2019-04-10
    • 1970-01-01
    • 2022-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-10
    相关资源
    最近更新 更多