javascript - 在node.js中返回多个shell命令的结果

标签 javascript node.js asynchronous

所以我想做的是循环遍历 JavaScript 对象数组(sensors),每个对象都有 cmdparser 属性,在系统 shell 中运行每个 cmd,使用适当的 parser 函数解析其输出,并将结果字符串附加到服务器的 res 对象。

第一个问题是我收到一个错误,声称当前对象没有方法parser。我尝试了一些不同的方法,但仍然无法让它识别对象的该属性。

第二个问题,当我放弃并在循环内硬编码解析函数时(这破坏了我添加需要不同解析器的命令的能力),因为每个命令的输出都是在回调函数中读取的,服务器在回调返回之前运行 res.end(),导致浏览器收到空响应。

我对 Node 和 JavaScript 还很陌生,所以我确信我犯了一些初学者的错误,我似乎无法在脑海中解决它们。任何帮助,将不胜感激。

// requires
var http = require('http');
var exec = require('child_process').exec;

// parsers
var parseTemp = function(str) {
    return ((parseInt(str, 16) / 50 - 273.15).toFixed(2));
};

// sensors
var sensors = [
    {
        label:  "Object temp",
        cmd:    "i2cget -y 3 0x5a 0x07 w",
        parser: parseTemp,
        units:  " degrees C"
    },
    {
        label:  "Ambient temp",
        cmd:    "i2cget -y 3 0x5a 0x06 w",
        parser: parseTemp,
        units:  " degrees C"
    }
];

// server
http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    for (var s in sensors) {
        exec(s.cmd, function (error, stdout, stderr) {
            res.write( s.label + ': ' + s.parser(stdout) + s.units + '\n' );
        });
    }
    res.end();
}).listen(1337, '');

console.log('Server running on port 1337');

最佳答案

您的第一个问题是每个回调函数引用相同的 s 的结果多变的。您可以通过更改 for(s in sensors) 轻松解决此问题循环进入 sensors.forEach(function(s){...}) 。这将关闭(google javascript 关闭) s 并使其成为每次回调的正确选择。可能还有其他问题 - 当我看到这个问题时,我并没有那么努力地寻找。

你的第二个问题正是你所说的。 res.end()在回调之前被调用 - 因为它们是异步的,所以最多会在当前执行“线程”完成后调用。您可以使用一个简单的计数器来解决这个问题:在每个 exec 之前递增调用,并在每个回调递减并检查计数器是否已达到其初始值 - 如果是,则运行 res.end() .

关于javascript - 在node.js中返回多个shell命令的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10021437/

相关文章:

javascript - Jquery ajax 表单数组提交

javascript - Laravel 简单的 crud 与 jquery ajax

javascript - react ;无法读取 render > return() 内未定义的属性

javascript - 上传前用 Canvas 调整图像大小

c# - 我们可以将异步方法转换为表达式主体吗?

javascript - nodejs中这两个异步函数有什么区别?

mysql - 适用于现有 MYSQL DB 的 Node REST API 框架

node.js - Sequelize 不生成连接表或获取/添加方法

java - openssl 的 "aes-256-cfb"的 Java 名称是什么?

python - 使用 Tornado 的嵌套 Web 服务调用(异步?)