Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 在Node/Express中,如何使用csv与数组匹配或比较嵌套承诺中的值_Node.js_Ajax_Csv_Express_Promise - Fatal编程技术网

Node.js 在Node/Express中,如何使用csv与数组匹配或比较嵌套承诺中的值

Node.js 在Node/Express中,如何使用csv与数组匹配或比较嵌套承诺中的值,node.js,ajax,csv,express,promise,Node.js,Ajax,Csv,Express,Promise,我有一个Node/Express-partial,它被AJAX调用,应该在随后的两次API调用之后将状态更新发送回视图。此工作流依赖csv到阵列模块来读取ship-orders.csv文件,并确定是否已发生第二个API调用(发送到装运)。它应该通过将csv文件中的OrderNumber与FindOrders端点(第一个API)返回的OrderNumber相匹配来实现这一点 问题是,我正在创建两个订单号数组进行比较,但将第一组订单号与第二组订单号匹配时,要么总是返回true,要么总是返回false

我有一个Node/Express-partial,它被AJAX调用,应该在随后的两次API调用之后将状态更新发送回视图。此工作流依赖csv到阵列模块来读取ship-orders.csv文件,并确定是否已发生第二个API调用(发送到装运)。它应该通过将csv文件中的OrderNumber与FindOrders端点(第一个API)返回的OrderNumber相匹配来实现这一点

问题是,我正在创建两个订单号数组进行比较,但将第一组订单号与第二组订单号匹配时,要么总是返回true,要么总是返回false,而且csv中的第一条记录应该非常清楚地显示“true”,而每一条记录都显示“false”

在开始编写大量代码之前,这里承诺将csv文件读入数组:

csv到阵列:

var csvShipPromise = new Promise(function(resolve, reject){

    var csvColumns = ['ChannelName', 'OrderNumber', 'LineNumber', 'WarehouseCode', 'Qty', 'Carrier', 'TrackingNumber', 'Shipdate', 'ShipMethod'];
    var csvShipArr;

    var csvArr;
    csvArray({
        file: shipLog,
        columns: csvColumns
    }, function(err, array){
        csvShipArr = array;
        resolve(csvShipArr);
    });
});
router.get('/', function(req, res, next) {

findPromise.then(function(findData){
    //Properly format xml string
    var foundData = replaceAll(findData, '&lt;', '<');
        foundData = replaceAll(foundData, '&gt;', '>');
    return foundData;  
}).then(function(foundData){
    //Parse xml to JSON and stringify
    var parsedFound;
    parseString(foundData, function(err, result){  //uses an xml to json module
       parsedFound = JSON.stringify(result); 
    });
    return(parsedFound);
}).then(function(parsedStr){
    //Parse JSON and return an array of objects
    var parsedJson = JSON.parse(parsedStr);
    var orders = parsedJson['soap:Envelope']['soap:Body'][0]['FindOrders'][0]['orders'][0]['order'];
    return orders;
}).then(function(orders){
    //Get only orders with a tracking number.
    var trackArray = [];
    var ord;
    for(ord in orders){
        var postObj = orders[ord];
        if(postObj.TrackingNumber[0].length > 1){
            trackArray.push(postObj);
        }
    }
    return trackArray;  //array of orders that contain tracking numbers
}).then(function(trackArray){

    /**** This is the block that is causing problems. *****/

    var tItm;

    var loggedOrders = [];
    for(tItm in trackArray){
        var alreadyLogged = false;
        var trackedItm = trackArray[tItm];
        var trackedOrderNum = trackedItm.ReferenceNum;
        csvShipPromise.then(function(csvOrders){
            var csv;
            var loggedOrderArr = [];
            for (csv in csvOrders){
                var csvItm = csvOrders[csv];
                var csvOrderNum = csvItm.OrderNumber; //gets the OrderNumber as expected
                loggedOrderArr.push(csvOrderNum);
            }
            return loggedOrderArr; //Return a simple array of all OrderNumbers
        }).then(function(loggedOrderArr){
            console.log(loggedOrderArr);
            console.log(trackedOrderNum);
            var ord;
            for (ord in loggedOrderArr){
                if(trackedOrderNum == loggedOrderArr[ord]){
                    console.log('found');
                    alreadyLogged = true;
                }
                else {
                    console.log('not found');
                    alreadyLogged = false;
                }
            }
            return loggedOrderArr; //Simply returning this value because the alreadyLogged test isn't working.
        });

        /*  Here is where the test fails.
          It shouldn't, because there are, say, 4 OrderNumbers in the result of the first API call,
          and only 1 Order number logged in the CSV.
          So it should be true once, and false 3 times.
          But it is true all the time.
        */
        if(alreadyLogged){
            console.log('found');  //Always logs true/found.
        } else {
            console.log('not found');
        }
    }
    return trackArray; //Just passing the array to the view, for now.
}).then(function(obj){
    res.send(obj);
    return(obj);
}).catch(function(err){
    console.log(err);
});
});
接下来,我有一个很长的承诺,当向partial发出请求时,它就会被执行。记录的订单号和需要过帐到装运的订单号之间的比较是第5个“then”块(在下面的代码中有注释)

路由器。获取并链接承诺:

var csvShipPromise = new Promise(function(resolve, reject){

    var csvColumns = ['ChannelName', 'OrderNumber', 'LineNumber', 'WarehouseCode', 'Qty', 'Carrier', 'TrackingNumber', 'Shipdate', 'ShipMethod'];
    var csvShipArr;

    var csvArr;
    csvArray({
        file: shipLog,
        columns: csvColumns
    }, function(err, array){
        csvShipArr = array;
        resolve(csvShipArr);
    });
});
router.get('/', function(req, res, next) {

findPromise.then(function(findData){
    //Properly format xml string
    var foundData = replaceAll(findData, '&lt;', '<');
        foundData = replaceAll(foundData, '&gt;', '>');
    return foundData;  
}).then(function(foundData){
    //Parse xml to JSON and stringify
    var parsedFound;
    parseString(foundData, function(err, result){  //uses an xml to json module
       parsedFound = JSON.stringify(result); 
    });
    return(parsedFound);
}).then(function(parsedStr){
    //Parse JSON and return an array of objects
    var parsedJson = JSON.parse(parsedStr);
    var orders = parsedJson['soap:Envelope']['soap:Body'][0]['FindOrders'][0]['orders'][0]['order'];
    return orders;
}).then(function(orders){
    //Get only orders with a tracking number.
    var trackArray = [];
    var ord;
    for(ord in orders){
        var postObj = orders[ord];
        if(postObj.TrackingNumber[0].length > 1){
            trackArray.push(postObj);
        }
    }
    return trackArray;  //array of orders that contain tracking numbers
}).then(function(trackArray){

    /**** This is the block that is causing problems. *****/

    var tItm;

    var loggedOrders = [];
    for(tItm in trackArray){
        var alreadyLogged = false;
        var trackedItm = trackArray[tItm];
        var trackedOrderNum = trackedItm.ReferenceNum;
        csvShipPromise.then(function(csvOrders){
            var csv;
            var loggedOrderArr = [];
            for (csv in csvOrders){
                var csvItm = csvOrders[csv];
                var csvOrderNum = csvItm.OrderNumber; //gets the OrderNumber as expected
                loggedOrderArr.push(csvOrderNum);
            }
            return loggedOrderArr; //Return a simple array of all OrderNumbers
        }).then(function(loggedOrderArr){
            console.log(loggedOrderArr);
            console.log(trackedOrderNum);
            var ord;
            for (ord in loggedOrderArr){
                if(trackedOrderNum == loggedOrderArr[ord]){
                    console.log('found');
                    alreadyLogged = true;
                }
                else {
                    console.log('not found');
                    alreadyLogged = false;
                }
            }
            return loggedOrderArr; //Simply returning this value because the alreadyLogged test isn't working.
        });

        /*  Here is where the test fails.
          It shouldn't, because there are, say, 4 OrderNumbers in the result of the first API call,
          and only 1 Order number logged in the CSV.
          So it should be true once, and false 3 times.
          But it is true all the time.
        */
        if(alreadyLogged){
            console.log('found');  //Always logs true/found.
        } else {
            console.log('not found');
        }
    }
    return trackArray; //Just passing the array to the view, for now.
}).then(function(obj){
    res.send(obj);
    return(obj);
}).catch(function(err){
    console.log(err);
});
});
router.get('/',函数(req,res,next){
然后(函数(findData){
//正确格式化xml字符串
var foundData=replaceAll(findData,“”,“”);
返回数据;
}).then(函数(foundData){
//将xml解析为JSON并字符串化
var-parsedFound;
parseString(foundData,function(err,result){//使用xml到json模块
parsedFound=JSON.stringify(结果);
});
返回(parsedFound);
}).then(函数(parsedStr){
//解析JSON并返回一个对象数组
var parsedJson=JSON.parse(parsedStr);
var orders=parsedJson['soap:Envelope']['soap:Body'][0]['FindOrders'][0]['orders'][0]['order'];
退货订单;
}).然后(功能(命令){
//仅获取带有跟踪编号的订单。
var trackArray=[];
var-ord;
for(订单中的ord){
var postObj=订单[ord];
if(postObj.TrackingNumber[0]。长度>1){
trackArray.push(postObj);
}
}
return trackArray;//包含跟踪号的订单数组
}).then(功能(轨迹阵列){
/****这就是导致问题的块*****/
var-tItm;
var loggedOrders=[];
用于(轨迹阵列中的tItm){
var alreadyLogg=false;
var trackedItm=trackArray[tItm];
var trackedOrderNum=trackedItm.ReferenceNum;
csvShipPromise.then(函数(csvOrders){
var-csv;
var loggedOrderArr=[];
用于(csvOrders中的csv){
var csvItm=csvOrders[csv];
var csvOrderNum=csvItm.OrderNumber;//按预期获取OrderNumber
loggedOrderArr.push(csvOrderNum);
}
return loggedOrderArr;//返回所有订单号的简单数组
}).then(函数(loggedOrderArr){
控制台日志(loggedOrderArr);
console.log(trackedOrderNum);
var-ord;
用于(作战需求文件在loggedOrderArr中){
if(trackedOrderNum==loggedOrderArr[ord]){
console.log('found');
alreadyLogg=true;
}
否则{
console.log('notfound');
alreadyLogg=false;
}
}
return loggedOrderArr;//只返回此值,因为alreadyLogg测试不起作用。
});
/*这就是测试失败的地方。
不应该,因为第一次API调用的结果中有4个订单号,
CSV中只记录了1个订单号。
所以它应该是真的一次,假的三次。
但这一直都是事实。
*/
如果(已标记){
console.log('found');//始终记录true/found。
}否则{
console.log('notfound');
}
}
return trackArray;//现在只将数组传递给视图。
}).然后(功能(obj){
res.send(obj);
返回(obj);
}).catch(函数(err){
控制台日志(err);
});
});

当我用console.log记录trackArray和loggedOrderArr的值时,我发现4个值的数组和1个值的数组之间应该有一个交集,但是由于某种原因,比较,
如果(trackedOrderNumber==loggedOrderArr[ord])
不起作用。

好吧,老实说,你的代码让我目瞪口呆。但据我所知,有几件事突然出现:

  • move var
    alreadyLogg=false到循环之前
    
  • 然后添加
    alreadyLogg=false
    if(alreadyLogg)
    语句之后
我认为这与范围有关。您基本上是在检查尚未更改的var的布尔值,因为您的承诺在
if(alreadyLogg)

我可以建议一种不同的方法吗

为什么不使用array.indexOf()

假设您有两个数组来比较arrA&arrB;您可以查看项目是否存在,如下所示:

var index = arrA.indexOf(arrB[0]); 
if(index == -1){
   console.log('No Match');
}
else{
   console.log('Match found');
}
不需要任何预设标志来查看一个数组是否包含元素

希望能有帮助

更详细一点:

var index = loggedOrderArray.indexOf(trackedOrderNum); 
if(index == -1){
   console.log('No Match');
   // -1 basicaly means that there is not instance of trackedOrderNum in loggedOrderArray
}
else{
   console.log('Match found');
}

好吧,老实说,你的密码让我眼花缭乱。但据我所知,有几件事突然出现:

  • move var
    alreadyLogg=false到循环之前
    
  • 然后添加
    alreadyLogg=false
    if(alreadyLogg)
    语句之后
我认为这与范围有关。您基本上是在检查尚未更改的var的布尔值,因为您的承诺在
if(alreadyLogg)

我可以建议一种不同的方法吗

为什么不使用array.indexOf()