如何在javascript中从child_process.exec获取返回值?

时间:2017-12-04 09:04:55

标签: javascript node.js

我尝试了以下代码,它显示res未定义。 我怎样才能退回标准输出?

function run_shell_command(command)
{
    var res
    exec(command, function(err,stdout,stderr){
     if(err) {
        console.log('shell error:'+stderr);
    } else {
        console.log('shell successful');
    }
    res = stdout
    // console.log(stdout)
    });
    return res
} 

3 个答案:

答案 0 :(得分:2)

除了使用exec函数的同步版本之外,您无法获得返回值。如果你仍然坚持这样做,你应该使用回调

function run_shell_command(command,cb) {   
    exec(command, function(err,stdout,stderr){
        if(err) {
          cb(stderr);
        } else {
          cb(stdout);
       }
   });
}

run_shell_command("ls", function (result) { 
   // handle errors here
} );

或者您可以将exec调用包含在promise中并使用async await

const util = require("util");
const { exec } = require("child_process");
const execProm = util.promisify(exec);

async function run_shell_command(command) {
   let result;
   try {
     result = await execProm(command);
   } catch(ex) {
      result = ex;
   }
   if ( Error[Symbol.hasInstance](result) )
       return ;

   return result;
}


run_shell_command("ls").then( res => console.log(res) );

答案 1 :(得分:0)

在这种情况下,child_process的结果值将在stdout中。为什么它不适合你?还在这里

if(err) {
    console.log('shell error:'+stderr);
}

为什么要检查err并记录stderr

答案 2 :(得分:0)

你的函数看起来像asynchrone,所以要在run_shell_command之外得到你的响应,你必须使用这样的回调函数:

function run_shell_command(command, callback) {
    exec(command, function (err, stdout, stderr) {
        if (err) {
            callback(stderr, null);
        } else {
            callback(null, stdout);
        }
    });
}

run_shell_command(command, function (err, res) {
    if (err) {
        // Do something with your error
    }
    else {
        console.log(res);
    }
});

您还可以像这样简化run_shell_command函数:

function run_shell_command(command, callback) {
    exec(command, callback);
}

希望它有所帮助。