Node.js:编写一个函数将spawn stdout作为字符串返回

时间:2013-03-20 04:44:22

标签: node.js

我正在尝试将此函数的输出作为字符串返回,但它仍然以未定义的形式返回。我哪里错了?

function run(cmd){
    var spawn = require('child_process').spawn;
    var command = spawn(cmd);
    var result = '';
    command.stdout.on('data', function(data) {
            result += data.toString();
    });
    command.on('close', function(code) {
            return result;
    });
}
console.log(run('ls'));

3 个答案:

答案 0 :(得分:35)

您的函数在command.on语句后立即返回。 return事件的回调中的close语句将返回到无处。 return属于事件回调,而不属于run()

调用console.log来代替return result

一般来说,你应该写一些类似的东西:

function run(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('close', function(code) {
        return callback(result);
    });
}

run("ls", function(result) { console.log(result) });

答案 1 :(得分:5)

var spawn = require('child_process').spawn,
    command  = spawn('ls', ['/tmp/']);
command.stdout.pipe(process.stdout);

以下link与您的问题完全相同。

答案 2 :(得分:1)

您始终可以将函数包装在promise中并返回。我发现比@fuwaneko的回调解决方案更有效

function run(cmd) {
    return new Promise((resolve, reject) => {
        var spawn = require('child_process').spawn;
        var command = spawn(cmd)
        var result = ''
        command.stdout.on('data', function(data) {
             result += data.toString()
        })
        command.on('close', function(code) {
            resolve(result)
        })
        command.on('error', function(err) { reject(err) })
    })
}