Nodejs 初学者,谁能帮帮怎么解决。
Nodejs 初学者,谁能帮帮怎么解决。
问题很简单
var exec = require(‘child_process’).exec;
function ls_cmd() { exec(‘ls’, function(error, stdout, stderr){ console.log(stdout); return stdout; }); }
var cmd = new ls_cmd(); 因为执行命令exec是无阻塞+回调的方式来实现,我想封装一些方法来获取命令行的返回结果有什么办法可以解决。
当然可以!你遇到的问题是因为 exec
是异步的,这意味着它不会立即返回结果。为了获取命令执行的结果,你需要在回调函数中处理数据。你可以通过将逻辑封装在一个函数中,并使用回调或 Promise 来处理异步操作。
示例代码
使用回调函数
const { exec } = require('child_process');
function ls_cmd(callback) {
exec('ls', (error, stdout, stderr) => {
if (error) {
callback(stderr, null);
return;
}
callback(null, stdout);
});
}
// 调用函数并传入回调函数
ls_cmd((error, result) => {
if (error) {
console.error(`Error: ${error}`);
return;
}
console.log(`Command output: ${result}`);
});
使用 Promise
const { exec } = require('child_process');
function ls_cmd() {
return new Promise((resolve, reject) => {
exec('ls', (error, stdout, stderr) => {
if (error) {
reject(stderr);
return;
}
resolve(stdout);
});
});
}
// 调用函数并使用 async/await 处理异步操作
async function runLsCmd() {
try {
const result = await ls_cmd();
console.log(`Command output: ${result}`);
} catch (error) {
console.error(`Error: ${error}`);
}
}
runLsCmd();
解释
-
回调函数:
ls_cmd
函数接收一个回调函数作为参数。- 在
exec
的回调中,如果发生错误,则调用callback
并传递错误信息。 - 如果没有错误,则调用
callback
并传递命令的输出结果。
-
Promise:
ls_cmd
函数返回一个 Promise。- 在
exec
的回调中,如果发生错误,则使用reject
抛出错误。 - 如果没有错误,则使用
resolve
传递命令的输出结果。 - 使用
async/await
语法来简化异步代码的读写性。
这两种方法都可以有效地处理异步操作,并获取命令行的返回结果。选择哪种方法取决于你的具体需求和代码风格。
从 stdout 和 stderr 里读,再用回调函数传回去。
赞
我做一个简单的例子给你看一下,,看是否符合你的要求。[我也只是一个刚自学不久的初学者, 有问题多交流] 注:async 你的用一个npm 包管理器安装一个, 如果不使用async, 那自己也可以用传函数回调的方式实现
var exec = require(‘child_process’).exec , async = require(‘async’) , my_util = require(’./util’);
exports.getSysInfo = function(req, res){
async.series(
[
function(callback){my_util.one(callback)}, //第一个命令
function(callback){my_util.two(callback)} //第二个命令
],
function (err, results)
{
res.send(my_util.formatArrayJson(results)); //这是返回值,results[0]第一个命令返回值,results[1] 第二个命令返回值, 格式化以后就可以把多个命令的值按JSON格式一起返回给前端。
});
}
----------------------util.js 文件---------------------------------
exports.formatArrayJson = function(array)
{
var result = {};
if(typeof(array) == ‘object’)
{
var len = this.objLength(array);
for(var i = 0; i < len; i++)
{
if(typeof(array[i]) == ‘object’)
{
for(key in array[i])
{
result[key] = array[i][key];
}
}
}
}
return result;
}
exports.one = function(callback)
{
exec(‘ls’, function(error, stdout, stderr){
callback(stderr, {‘hostname’:stdout});
});
}
exports.two = function(callback)
{
exec(‘ls /etc’, function(error, stdout, stderr){
callback(stderr, {‘uptime’:stdout});
});
}
直接用 shelljs 的 exec https://github.com/arturadib/shelljs ? 或者参考他的 execAsync 的实现 https://github.com/arturadib/shelljs/blob/master/src/exec.js#L98 ?