[英]Returning the result of multiple shell commands in node.js
所以我想做的是遍历 javascript 个对象( sensors
)的数组,每个对象都有cmd
和parser
属性,在系统 shell 中运行每个cmd
,用适当的parser
解析它的 output 结果字符串 883400406848988 到 63400406848988服务器的res
object。
第一个问题是我收到一条错误消息,声称当前 object 没有方法parser
。 我已经尝试了一些不同的东西,但仍然无法识别 object 的那个属性。
第二个问题,当我放弃并在循环内硬编码解析 function(这破坏了我添加需要不同解析器的命令的能力)时,是因为每个命令的 output 在回调 function 中读取,服务器运行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');
您的第一个问题是每个回调 function 引用相同s
变量的结果。 您可以通过将for(s in sensors)
循环更改为sensors.forEach(function(s){...})
来轻松解决此问题。 这将关闭(谷歌 javascript 闭包) s 并在时机成熟时使其成为每个回调的正确选择。 可能还有其他问题 - 看到这个问题后,我看起来并没有那么认真。
你的第二个问题正是你所说的。 res.end()
在回调之前被调用——因为它们是异步的,所以最好在当前“线程”执行完成后调用。 您可以使用一个简单的计数器来解决这个问题:在每次exec
调用之前递增,并在每次回调递减时检查计数器是否已达到其初始值 - 如果是,则运行res.end()
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.