2016-12-26 175 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 
    }); 
}; 
相关问题