node.js - 在 Node/Express 中,如何使用 csv-to-array 来匹配或比较嵌套 Promise 中的值

标签 node.js ajax csv express promise

我有一个使用 AJAX 调用的 Node/Express 部分,并且应该在进行 2 次后续 API 调用后将状态更新发送回 View 。此工作流依赖 csv-to-array 模块来读取 Ship-orders.csv 文件,并确定是否已发生第二个 API 调用(POST 到 Shipments)。它应该通过将 csv 文件中的 OrderNumber 与 FindOrders 端点(第一个 API)返回的 OrderNumber 进行匹配来实现此目的。

问题是我正在创建 2 个订单号数组进行比较,但将第一组订单号与第二组订单号匹配要么始终返回 true,要么始终返回 false,并且非常清楚地应该为 csv 中的第一条记录显示“true”,为其他记录显示“false”。

在进入大部分代码之前,这里是将 csv 文件读入数组的 promise :

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);
    });
});

接下来,我有一个很长的 promise ,当对部分请求发出时,该 promise 就会被执行。记录的 OrderNumbers 和需要发布到 Shipments 的 OrderNumbers 之间的比较是第 5 个“then” block (在下面的代码中对其进行了注释)。

router.get 和链式 promise :

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);
});
});

当我console.log trackArray 和loggingOrderArr 的值时,我发现4 个值的数组和1 个值的数组之间应该存在交集,但由于某种原因,比较if(trackedOrderNumber ==loggingOrderArr[ord]) 不起作用。

最佳答案

好吧,说实话,你的代码让我眼花缭乱。但据我所知,出现了一些事情:

  • 将 var alreadyLogged = false; 移至循环之前;
  • 然后在 if(alreadyLogged) 语句后添加 alreadyLogged = false;

我认为这与范围有关。您基本上是在检查尚未更改的 var 的 bool 值,因为您的 promise 在 if(alreadyLogged)

点尚未解决

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

为什么不使用 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');
}

关于node.js - 在 Node/Express 中,如何使用 csv-to-array 来匹配或比较嵌套 Promise 中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51733863/

相关文章:

javascript - app.js 中需要错误

javascript - 动态导出

ajax - <f :ajax onerror> called on every ajax request even if completed

java - 将执行测试所需的时间附加到最终用户友好的 .xls/.csv 文件中

html - 无法将 View 添加为 html 页面 (sails.js)

node.js - 默认值在 swagger Node 请求中显示在哪里?

javascript - 如何在每次单击按钮时使用 php 和 ajax 比较两个数组

javascript - 回发后运行 javascript 函数

python - 修补 Python 中 CSV 文件中缺失的行

python - 写入 CSV 中的不同列