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是无阻塞+回调的方式来实现,我想封装一些方法来获取命令行的返回结果有什么办法可以解决。

6 回复

当然可以!你遇到的问题是因为 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();

解释

  1. 回调函数

    • ls_cmd 函数接收一个回调函数作为参数。
    • exec 的回调中,如果发生错误,则调用 callback 并传递错误信息。
    • 如果没有错误,则调用 callback 并传递命令的输出结果。
  2. 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}); }); }

在 Node.js 中,child_process.exec 方法是异步的,并且通过回调函数来处理结果。由于 JavaScript 的单线程特性,直接通过同步的方式获取 exec 方法的结果是不可能的,因为这会导致程序阻塞。

你可以通过以下几种方式来解决这个问题:

使用 Promise

exec 封装成一个返回 Promise 的函数,这样你就可以使用 .then()async/await 来获取执行命令后的结果。

const { exec } = require('child_process');

function execCmd(command) {
    return new Promise((resolve, reject) => {
        exec(command, (error, stdout, stderr) => {
            if (error) {
                reject({ error, stderr });
            }
            resolve(stdout);
        });
    });
}

// 使用 async/await
async function runCommand() {
    try {
        const result = await execCmd('ls');
        console.log(result);
    } catch (err) {
        console.error(err.stderr);
    }
}

runCommand();

使用 async 函数

如果你不想使用 Promise,可以定义一个异步函数来执行命令。

const { exec } = require('child_process');

async function execCmd(command) {
    return new Promise((resolve, reject) => {
        exec(command, (error, stdout, stderr) => {
            if (error) {
                reject({ error, stderr });
            }
            resolve(stdout);
        });
    });
}

// 调用函数
execCmd('ls').then(result => {
    console.log(result);
}).catch(err => {
    console.error(err.stderr);
});

解释

  1. Promiseasync/await 的结合使用可以帮助你在异步操作中获得更好的代码结构和可读性。
  2. 通过将 exec 方法封装进一个返回 Promise 的函数中,你可以更容易地处理异步操作的结果。
  3. 这种方法避免了直接使用回调带来的嵌套问题(回调地狱)。

希望以上方法能够帮助你解决你的问题!

回到顶部