[英]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.