だから私がやろうとしているのは、javascript オブジェクト ( sensors
) の配列をループし、それぞれにcmd
とparser
属性を付け、それぞれcmd
をシステム シェルで実行し、その出力を適切なparser
関数で解析し、結果の文字列をサーバーのres
オブジェクトに追加することです。
最初の問題は、現在のオブジェクトにメソッドがないというエラーが表示されることparser
です。私はいくつかの異なることを試しましたが、オブジェクトのその属性を認識できません。
2 つ目の問題は、ループ内で解析関数をあきらめてハードコーディングしたとき (これにより、別のパーサーを必要とするコマンドを追加する機能が失われます)、各コマンドの出力がコールバック関数で読み取られるため、サーバーがres.end()
前に実行されることです。コールバックが返され、ブラウザーに空の応答が返されます。
私はノードと 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');