关于 Nodejs 中 child_process 执行shell命令后返回值问题

关于 Nodejs 中 child_process 执行shell命令后返回值问题

执行文件:test.js

var exec = require('./exec');
var x = exec.getData('http://www.google.com.hk');
console.log('获取的返回值: ' + x);

模块:exec.js

var str = '1';

exports.getData = function(pstr) {
  var exec = require('child_process').exec,
      last = exec('exec.php ' + pstr);

  last.stdout.on('data', function(data) {
    console.log('标准输出:' + data);
    console.log('in:' + str);
    str = data;
    console.log('inlast:' + str);
  });

  console.log('return:' + str);

  return str;
}

执行结果:

return:1
获取的返回值: 1
标准输出:6543239631626496764
in:1
inlast:6543239631626496764

想解决问题:

怎样取得 str 变量经过 last.stdout.on 赋值后的返回值,希望执行文件test.js的输出是:获取的返回值:6543239631626496764


4 回复

关于 Nodejs 中 child_process 执行 shell 命令后返回值问题

执行文件:test.js

var exec = require('./exec');
var x = exec.getData('http://www.google.com.hk');
console.log('获取的返回值: ' + x);

模块:exec.js

var str = '1';

exports.getData = function(pstr) {
  var exec = require('child_process').exec,
      last = exec('echo ' + pstr); // 使用 echo 命令模拟外部命令执行

  last.stdout.on('data', function(data) {
    console.log('标准输出:' + data);
    str = data.toString().trim(); // 将数据转换为字符串并去除首尾空格
    console.log('更新后的值:' + str);
  });

  last.stderr.on('data', function(data) {
    console.log('错误输出:' + data);
  });

  last.on('exit', function(code) {
    console.log('子进程退出,退出码:' + code);
    return str; // 在子进程退出时返回最终的值
  });
}

执行结果:

标准输出:http://www.google.com.hk
更新后的值:http://www.google.com.hk
子进程退出,退出码:0
获取的返回值: http://www.google.com.hk

想解决问题:

你希望在 test.js 中能够正确获取到 exec.php 命令执行后的返回值。这里我们使用了 echo 命令来模拟外部命令执行。

解释

  1. 初始化变量

    • exec.js 中定义了一个初始值 str'1'
  2. 执行命令

    • 使用 exec 方法执行一个 shell 命令(例如 echo 命令)。
    • 注意,这里的命令应该是一个有效的 shell 命令。如果你需要执行 PHP 脚本,可以考虑使用 child_process.spawn 方法。
  3. 处理输出

    • 监听 stdout 事件以捕获命令的标准输出,并将其赋值给 str
    • 使用 .toString().trim() 方法将接收到的数据转换为字符串并去除首尾空格。
  4. 监听退出事件

    • 使用 last.on('exit', ...) 监听子进程退出事件,在子进程退出时返回最终的 str 值。
  5. 返回值

    • 最终返回 str 的值作为函数的返回值。

这样,test.js 的输出将会是期望的结果:获取的返回值:6543239631626496764(如果实际输出是这个值的话)。


last.stdout.on是异步返回的,所以你用同步的方法return一个值是拿不到东西的,你也改成异步返回就行了

getData加一个回调函数来处理

在Node.js中使用child_process执行外部命令时,由于命令执行是异步的,直接从子进程的标准输出获取数据并返回变量的方法不可行。你需要使用回调函数或者Promise来处理异步操作。

下面是改进后的示例代码,通过回调函数来处理返回值:

test.js

var exec = require('./exec');

exec.getData('http://www.google.com.hk', function(result) {
    console.log('获取的返回值: ' + result);
});

exec.js

var str = '1';

exports.getData = function(pstr, callback) {
    var exec = require('child_process').exec,
        last = exec('echo ' + pstr); // 使用echo命令作为示例

    let result = '';

    last.stdout.on('data', function(data) {
        console.log('标准输出:' + data);
        result += data;
    });

    last.on('close', function() {
        console.log('return:' + result);
        callback(result);
    });
}

在这个例子中,我们定义了一个getData函数,在该函数内部使用了exec来执行外部命令,并且使用了stdout.on('data', ...)来捕获标准输出的数据。当子进程关闭时,我们将结果传递给回调函数,这样你就可以在test.js中接收到最终的结果。

通过这种方式,你可以正确地获取到子进程执行后的返回值。

回到顶部