数组在Javascript中返回空

时间:2018-04-12 12:11:53

标签: javascript arrays node.js

这对我来说还是一个新手,但是当我在NodeJS应用程序中生成一个处理.nessus结果文件的数字数组时,我遇到了一个有趣的行为问题。首先,我要完成的一些细节。我的应用程序从上传的“结果”文件生成一个数组[1234,1223,1222],然后用于查询mongodb实例以确定这些条目当前是否在数据库中。如果这些条目当前不在mongodb实例中,则它会重定向到用户可以在添加之前编辑它们的页面。如果没有新条目,则会转到页面以生成条目报告。

上传文件时,会存储新条目。在.nessus文件中,有时会有多个带有条目的主机。这改变了json结构,函数需要以不同的方式迭代。以下函数是这些条目的存储方式。 这很重要,因为这是怪异行为的起源(我认为)

function parsePluginNumbers(json){

    var pluginNumbers = []

    //Let's check the number of hosts
    var hostLength = json['NessusClientData_v2']['Report'].ReportHost.length

    if (hostLength != undefined) {
        for (var i = 0; i < hostLength; i++) { //Since there is more than 1, need to iterate over each host to find the findings.
            var item_length = json['NessusClientData_v2']['Report'].ReportHost[i].ReportItem.length
            for (var t = 0; t < item_length; t++) { //Iterate through each finding on each host
                if (json['NessusClientData_v2']['Report'].ReportHost[i].ReportItem[t].risk_factor != 'None') { 
                    var newEntry = json['NessusClientData_v2']['Report'].ReportHost[i].ReportItem[t].pluginID
                    if (pluginNumbers.indexOf(newEntry) == -1) {
                        pluginNumbers.push(newEntry)
                    }
                    else {
                        continue
                    }
                } else {
                    continue
                }
            }
        }
    } else {
        var item_length = json['NessusClientData_v2']['Report']['ReportHost'].ReportItem.length
        for (var t = 0; t < item_length; t++) { //Iterate over findings 
                if (json['NessusClientData_v2']['Report']['ReportHost'].ReportItem[t].risk_factor != 'None') { 
                    var newEntry = json['NessusClientData_v2']['Report']['ReportHost'].ReportItem[t].pluginID
                    if (pluginNumbers.indexOf(newEntry) == -1) {
                        pluginNumbers.push(newEntry)
                    }
                    else {
                        continue
                    }
                } else {
                    continue
                }
        }
    }
    return pluginNumbers    
}

存储这些插件后。调用另一个函数来查看这些结果是否在mongodbinstance中。在这个函数中,这些插件位于数组“pluginsTotal”中。

    function queryForNewResultsInANessusFile(pluginsTotal, collectionname, filename){ //function to call mongodb query and send results to parseNewFindings and parseOldFindings.
    var db = req.db;
    var collection = db.get(collectionname);

    collection.find({ 'PluginNumber' : { $in: pluginsTotal }}, 'FindingTitle FindingDescription Remediation Mitigation SeeAlso PluginFamily PluginNumber CVE Risk -_id', function(error, result){
        var newPluginArray = parseOutFindingNumbersInMongoDB(result, pluginsTotal);


//IF statements go here with specific redirects as needed to check if there are new values not in the repo
}

在此collection.find调用期间,有一个函数parseOutFindingNumbersInMongoDB被调用,以确定.nessus结果文件中是否有不在repo中的插件。它比较了collection.find和pluginsTotal(从第一个函数生成)的结果,并返回了不在repo中的新插件的数组。功能详情如下:

function parseOutFindingNumbersInMongoDB(repoResults, reportPlugins) {

    for (var i = 0; i < repoResults.length; i++){
        var index = reportPlugins.indexOf(repoResults[i].PluginNumber);
        if (index != -1) {
            reportPlugins.splice(index, 1);
            }
        else {
            continue
            }
    }
    return reportPlugins
}

现在我的问题---当我上传一个包含多个主机的.nessus文件时,即使有新条目,parseOutFindingNumberInMongoDB也会返回空。是什么赋予了?这是我在parsePluginNumbers函数中解析数字的方式,还是因为它在collection.find同步函数中被调用(这似乎不太可能,就好像有一个主机,它返回我想要的新插件值) ?任何想法/想法/评论都会非常感激,因为我无法弄清楚出了什么问题。在传递给函数之前,我检查了数组中的数据类型,它们都匹配。

1 个答案:

答案 0 :(得分:0)

它总是返回一个空数组,因为数组中的每个元素都与要拼接的条件匹配。

首先使用此过滤器PluginNumber

检索pluginTotal数组中{ $in: pluginsTotal }的元素
collection.find({ 'PluginNumber' : { $in: pluginsTotal }}, 'FindingTitle FindingDescription Remediation Mitigation SeeAlso PluginFamily PluginNumber CVE Risk -_id', function(error, result){
    var newPluginArray = parseOutFindingNumbersInMongoDB(result, pluginsTotal);
}

然后删除PluginNumber

pluginTotal的所有元素
    var index = reportPlugins.indexOf(repoResults[i].PluginNumber);
    if (index != -1) {
        reportPlugins.splice(index, 1);
    }

所以结果总是一个空数组。