关于 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
关于 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
命令来模拟外部命令执行。
解释
-
初始化变量:
- 在
exec.js
中定义了一个初始值str
为'1'
。
- 在
-
执行命令:
- 使用
exec
方法执行一个 shell 命令(例如echo
命令)。 - 注意,这里的命令应该是一个有效的 shell 命令。如果你需要执行 PHP 脚本,可以考虑使用
child_process.spawn
方法。
- 使用
-
处理输出:
- 监听
stdout
事件以捕获命令的标准输出,并将其赋值给str
。 - 使用
.toString().trim()
方法将接收到的数据转换为字符串并去除首尾空格。
- 监听
-
监听退出事件:
- 使用
last.on('exit', ...)
监听子进程退出事件,在子进程退出时返回最终的str
值。
- 使用
-
返回值:
- 最终返回
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
中接收到最终的结果。
通过这种方式,你可以正确地获取到子进程执行后的返回值。