簡體   English   中英

在node.js中返回多個shell命令的結果

[英]Returning the result of multiple shell commands in node.js

所以我想做的是遍歷 javascript 個對象( sensors )的數組,每個對象都有cmdparser屬性,在系統 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM