节点脚本刚刚停止

时间:2019-11-13 20:04:02

标签: node.js linux

我有一个很大的多节脚本,其中包含很多循环和一些递归。当我在非常大的数据集上运行它时,脚本将停止运行。它以0退出代码停止。显然,它实际上并没有完成运行……只是……停止了。

asyncLib.waterfall([
   getPronghornToken,
   saveSchedulers,
   saveServices,
   populateServRefs,
   saveServiceGroups,
   saveNetworks,
   populateNetRefs,      //never actually gets out of this function.  Just exits with code 0
   saveNetworkGroups,
   saveRuleGroups,
   fetchRuleGroupIds,
   populateRules,
   saveRules,
   getPolicyId,
   linkRuleGroup
], function (err, result) {
   if (err){
       console.error("Something bad happened. Please try again");
       process.exit(1);
   }
   console.log("done");
});

我要查找的内容:为什么脚本只在循环中停止并以0代码退出?

注意:备用代码。

getPronghornToken((err, token) => {
if(err) {
    console.log("Error occured getPronghornToken");
    throw err;
}
   saveSchedulers(token, (err, token) => {
    if(err) {
        console.log("Error occured saveSchedulers");
        throw err;
    }
    saveServices(token, (err, token) => {
        if(err) {
            console.log("Error occured saveServices");
            throw err;
        }
        populateServRefs(token, (err, token) => {
            if(err) {
                console.log("Error occured populateServRefs");
                throw err;
            }
            saveServiceGroups(token, (err, token) => {
                if(err) {
                    console.log("Error occured saveServiceGroups");
                    throw err;
                }
                saveNetworks(token, (err, token) => {
                    if(err) {
                        console.log("Error occured saveNetworks");
                        throw err;
                    }
                    populateNetRefs(token, (err, token) => {
                        if(err) {
                            console.log("Error occured populateNetRefs");
                            throw err;
                        }
                        saveNetworkGroups(token, (err, token) => {
                            if(err) {
                                console.log("Error occured saveNetworkGroups");
                                throw err;
                            }
                            saveRuleGroups(token, (err, token) => {
                                if(err) {
                                    console.log("Error occured saveRuleGroups");
                                    throw err;
                                }
                                fetchRuleGroupIds(token, (err, token) => {
                                    if(err) {
                                        console.log("Error occured fetchRuleGroupIds");
                                        throw err;
                                    }
                                    populateRules(token, (err, token) => {
                                        if(err) {
                                            console.log("Error occured populateRules");
                                            throw err;
                                        }
                                        saveRules(token, (err, token) => {
                                            if(err) {
                                                console.log("Error occured saveRules");
                                                throw err;
                                            }
                                            getPolicyId(token, (err, token) => {
                                                if(err) {
                                                    console.log("Error occured getPolicyId");
                                                    throw err;
                                                }
                                                linkRuleGroup(token, (err, token) => {
                                                    if(err) {
                                                        console.log("Error occured linkRuleGroup");
                                                        throw err;
                                                    }

                                                    console.log("Successfully installed all files");
                                                });
                                            });
                                        });
                                    });
                                });
                            });
                        });
                    });
                });
            });
        });
    });
   });
});

没有引发错误。不打印最里面的消息。回调模式已验证。

上次运行的功能如下:

async function populateNetRefs(token, callback) {
//let newNetRefs = [];
for(let index = 0; index < networkGroups.length; index++) {
    if (index >= networkGroups.length) {
        console.log("Net Refs Finished")
        return callback(null, token);
    }
    let networkGroup = networkGroups[index];
    try {
        console.log(`fetching network number: ${index+1} / ${networkGroups.length}`);
        let newNetRefs = await fetchNetId(token, networkGroup._netRefs);

        networkGroup._netRefs = newNetRefs;
    } catch (err) {
        console.log(`An error occurrent fetching the network id for index ${index+1} / ${networkGroups.length}: ${err}`);
    }
}
}

内部功能:

function fetchNetId(token, _netRefs) {
let fetchFinished = 0;
let newNetRefs = [];
let errCount = 1;
console.log("ZZ Fetchid Start ZZ");
return new Promise((resolve, reject) => {
    _netRefs.forEach(function(_netRef) {
        let options = {
            //Required to be hidden
        };

        let req = https.request(options, (res) => {
            let reply = [];
            res.setEncoding('utf8');
            res.on('data', (chunk) => {
                console.log("YY GET DATA CHUNK YY");
                reply.push(chunk);
            });
            res.on('end', () => {
                fetchFinished++;
                console.log("Reply is : " + reply.join());
                //There is some logic in this spot.  Not for you.
                console.log("fetchFinished is: " + fetchFinished + ", size is: " + _netRefs.length);
                if (fetchFinished === _netRefs.length) {
                    resolve(newNetRefs);
                }
            });
        });
        req.on('error', (e) => {
            console.error(`problem with request ${errCount++}: ${e.message}`);
            //reject(e);
        });

        let body = JSON.stringify({
            "options" : {
                "start": 0,
                "limit": 5,
                "sort": {

                },
                "filter": {
                    "name":{"$eq":_netRef}
                }
            }
        });
        console.log("XX Sending Request XX");
        req.write(body);
        req.end();
    });
});
}

行为更新-更多控制台日志

这是控制台日志的结尾:

fetching network number: 49 / 711
ZZ Fetchid Start ZZ
XX Sending Request XX
XX Sending Request XX
YY GET DATA CHUNK YY
Reply is : {hidden from you}
TroubleShootingDias: some guid
fetchFinished is: 1, size is: 2
YY GET DATA CHUNK YY
Reply is : {hidden from you}
TroubleShootingDias: some guid
fetchFinished is: 2, size is: 2
fetch success
fetching network number: 50 / 711
ZZ Fetchid Start ZZ
[vagrant@vag-host1 space-parser]$

2 个答案:

答案 0 :(得分:1)

我强烈建议您查看async.waterfall来帮助构建这样的代码,因为它可能是调试和阅读的母马。在上面的代码中有很多要掌握的地方,但是将以下内容包装在try catch中可能会有所帮助。当您处理请求错误时-这些仅是请求错误,并且可能会包含其他一些内容,包括可能格式错误的url等,并且在这种情况下您不会返回诺言。

try {
    let req = https.request(options, (res) => {
        let reply = [];
        res.setEncoding('utf8');
        res.on('data', (chunk) => {
            console.log("YY GET DATA CHUNK YY");
            reply.push(chunk);
        });
        res.on('end', () => {
            fetchFinished++;
            console.log("Reply is : " + reply.join());
            //There is some logic in this spot.  Not for you.
            console.log("fetchFinished is: " + fetchFinished + ", size is: " + _netRefs.length);
            if (fetchFinished === _netRefs.length) {
                resolve(newNetRefs);
            }
        });
    });
    req.on('error', (err) => {
        console.error(`problem with request ${errCount++}: ${err.message}`);
        return reject(err);
    });
}
catch(err) {
    console.error(`problem with request ${err.message}`);
    return reject(err);
}

答案 1 :(得分:1)

问题的实际解决方案:如果数组为空,则承诺将永远无法解决。在循环之前,在最顶部添加了一个空支票。

Set WshShell = WScript.CreateObject("WScript.Shell")
Set oShell = CreateObject("WScript.Shell")
WshShell.AppActivate "IMPORT"
WshShell.SendKeys "{TAB}"
WshShell.SendKeys "{TAB}"
WshShell.SendKeys "{ENTER}"