2016-12-26 385 views
0

好的。所以我對節點非常陌生。我的腦子裏現在正在旋轉地獄。我已經閱讀了許多類似的問題,但似乎無法讓它正常運行。Node.js在執行函數之前需要等待循環完成

本質上,我解析通過服務器日誌regex'ing特定的字符串,我將用於運行一些SQL查詢。我已經得到這個在不需要循環的較小規模上工作。

我需要等待所有的ppsid運行通過_cssPPSID,這是生成一個字典對象和我的查詢過濾器,然後在查詢本身使用該過濾器運行查詢,然後匹配該字典以配對結果從服務器日誌中分析數據。

截至目前,此代碼運行,但在第一次迭代後停止。我假設我錯過了一個回調或簡單的東西,以便腳本可以回到循環。

var ppsDict = new Object(); 
var ppsList = new Array(); 

var getURL = function(stdout) { 
    console.log('Creating ppsid url key value pairs'); 
    var url_reg = /http\S+/g; 
    var ppsid_reg = /PPS_ID\=[0-9]+/g; 
    var ppsid = stdout.toString().match(ppsid_reg); 
    var url = stdout.toString().match(url_reg); 
    ppsDict[ppsid[0]] = url[0]; 
    ppsList.push(ppsid[0]); 
    console.log(ppsDict); 
    }; 


var getPPSID = function(stdout, prodServer, searchResultProcessed) { 
    console.log("Collecting PPSID's"); 
    var ppsid_reg = /PPS_ID\=[0-9]+/g; 
    var selector_reg = /selector\s\S+/g; 
    var ppsid = stdout.toString().match(ppsid_reg); 
    var selector = stdout.toString().match(selector_reg); 
    async.eachSeries(ppsid, function (ppsSelector, next) { 
     var urlQ = new urlQuery(prodServer, searchResultProcessed, ppsSelector); 
     _cssPPSID(urlQ, function(err, result) { 
     if(err) { 
      console.log(err); 
     } 
     next(); 
     }) 
    }, function (err) { 
     console.log('iterating done'); 
     //queryProd(ppsList,ppsDict); 
    }); 
} 


function urlQuery(prodServer, searchResultProcessed, ppsSelector) { 
    this.cssPPSID = "ssh " + prodServer + " 'sudo cat /mint/logs/topologies/'" + searchResultProcessed + " | grep " + ppsSelector + " | grep \"Downloading\""; 
} 

var _cssPPSID = (urlQ) => { 
    child_process.exec(urlQ.cssPPSID, ["-m"], (err, stdout, stderr) => { 
    if (stdout === 0) { 
     console.log('PPS_ID and CSS error combination not found'); 
     return; 
    } else if (err) { 
    console.error(err, stderr); 
     return; 
    } 
    getURL(stdout); 
    }); 
}; 

回答

1

async.eachSeries不會起作用,因爲功能_cssPPSID並不需要一個回調的第二個參數,所以next()永遠不會被調用。

嘗試重寫它像這樣:

var _cssPPSID = (urlQ, callback) => { 
    child_process.exec(urlQ.cssPPSID, ["-m"], (err, stdout, stderr) => { 
    if (err) { 
     return callback(err); 
    }   
    if (stdout === 0) { 
     return callback(new Error('PPS_ID and CSS error combination not found'); 
    } 
    // do stuff here 
    callback(null); // null indicates no error has happened 
    }); 
}; 
相關問題