Node.js 在Node/Express中,如何使用csv与数组匹配或比较嵌套承诺中的值
我有一个Node/Express-partial,它被AJAX调用,应该在随后的两次API调用之后将状态更新发送回视图。此工作流依赖csv到阵列模块来读取ship-orders.csv文件,并确定是否已发生第二个API调用(发送到装运)。它应该通过将csv文件中的OrderNumber与FindOrders端点(第一个API)返回的OrderNumber相匹配来实现这一点 问题是,我正在创建两个订单号数组进行比较,但将第一组订单号与第二组订单号匹配时,要么总是返回true,要么总是返回false,而且csv中的第一条记录应该非常清楚地显示“true”,而每一条记录都显示“false” 在开始编写大量代码之前,这里承诺将csv文件读入数组: 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
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, '<', '<');
foundData = replaceAll(foundData, '>', '>');
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, '<', '<');
foundData = replaceAll(foundData, '>', '>');
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)
- 然后添加
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)
- 然后添加
if(alreadyLogg)
我可以建议一种不同的方法吗
为什么不使用array.indexOf()
让