2

我编写了一个 NodeJS 应用程序,它使用 eBay API 从 eBay 获取列表。我遇到了一个问题,即某些项目正在通过,即使它们应该用一个简单的 if 语句过滤掉。

该应用程序从前端以 JSON 形式接收帖子数据,执行每个搜索,然后根据某些参数过滤掉项目。这是有问题的代码:

if ( items[i].listingInfo.listingType != 'Auction' ) {
    //console.log( items[i].listingInfo.listingType );

    if ( items[i].primaryCategory.categoryId == '9355' ) {
        //console.log( items[i].primaryCategory.categoryId );

        if ( price < maxPrice && price > 40 ) {
            //console.log( price, maxPrice );
            file =  path + 
                    items[i].itemId + '-' + 
                    price + '-' + maxPrice + '-' + 
                    items[i].primaryCategory.categoryId + '-' + 
                    items[i].listingInfo.listingType;

            if ( !fs.existsSync( file ) ) {
                console.log(
                    'File ' + file + ' does not exist.', 
                    !fs.existsSync( file ), 
                    items[i].listingInfo.listingType, 
                    price < maxPrice,
                    items[i].itemId
                );

                fs.writeFile( file, ' ', function(err) {
                    if (err) {
                        if (debug)
                            console.log('Writing ' + file + ' failed.');
                    }
                    else {
                        if (debug)
                            console.log('Writing ' + file + ' worked.');      
                        returnData.success = true;
                        returnData.results[ result.itemId ] = result;
                        console.log( price, maxPrice, !fs.existsSync( file ) );
                        console.log('success');
                    }
                })
            }
            else {
                returnData.discard.file[ result.itemId ] = result;
                delete returnData.results[ result.itemId ];
            }

        }
        else {
            returnData.discard.price[ result.itemId ] = result;
            if (debug)
                console.log('FAILED (price): ' + items[i].itemId + ' is ' + ( price - maxPrice ) + ' greater than maxPrice.');
        }
    }
    else {
        returnData.discard.cat[ result.itemId ] = result;
        if (debug)
            console.log('FAILED (categoryId): ' + items[i].itemId + ' is ' + items[i].primaryCategory.categoryId);
    }                    
}
else {
    returnData.discard.type[ result.itemId ] = result;
    if (debug)
        console.log('FAILED (listingType): ' + items[i].itemId + ' is a ' + items[i].listingInfo.listingType);                
}

您可以看到此行if ( price < maxPrice && price > 40 )应该过滤掉任何大于 maxPrice 且小于 40 的项目。但是,它不会这样做。我不知道为什么会这样,也不知道这里发生了什么。它看起来非常简单明了,但事实并非如此。这是返回的对象,您可以在其中看到它无法正常工作。

111004318957:
    listingType: "FixedPrice"
    maxPrice: 170
    price: 349

我也在使用节点集群,所以我的 server.js 文件有这个:

    function start(route, handle) {
        if ( cluster.isMaster ) {

            for ( var i = 0; i < numCPUs; i++ ) {
                cluster.fork();
            }

            cluster.on('exit', function( worker, code, signal) {
                console.log( 'worker ' + worker.process.pid + ' died' );
            })
        }
        else {
            function onRequest(request, response) {
                var postData = "";
                var pathname = url.parse(request.url).pathname;

                request.setEncoding("utf8");
                request.addListener("data", function(postDataChunk) {
                    postData += postDataChunk;
                });
                request.addListener("end", function() {
                    //console.log('Request ended.');
                    if ( postData != '' ) {
                        postData = JSON.parse(postData);
                    }
                    //console.log(postData.search.searches[0]);
                    route(handle, pathname, response, postData);
                });
            }
            http.createServer(onRequest).listen(8888);
            console.log("Server has started.");
        }
    }

感谢这里的任何帮助,谢谢。

编辑:我应该解释的111004318957是 eBay 返回的 itemId。结果对象如下所示:

results: {
    itemId1: {
        listingType: '',
        maxPrice: '',
        price: ''
    },
    itemId2: {
        listingType: '',
        maxPrice: '',
        price: ''
    }
}

编辑 2: price在此代码段之前设置。它在 eBay 的响应中返回,它的位置取决于 items[i].listingInfo.listingType,所以有一个简单的 if/else 来设置它。

if ( items[i].listingInfo.listingType == 'AuctionWithBIN' ) {
    price = parseInt( items[i].listingInfo.buyItNowPrice.USD );
}
else {
    price = parseInt( items[i].sellingStatus.currentPrice.USD );
}
4

2 回答 2

0

JSON 返回listingType、maxPrice、价格。

尝试if (items[i].price < maxPrice && items[i].price > 40)

于 2013-02-07T23:29:57.630 回答
0

作者几乎可以肯定无法对这个问题做出任何贡献,以澄清我的陈述是否真实,就像六年前被问到的那样。

但是,可以肯定的是,问题与以下代码部分有关:

fs.writeFile( file, ' ', function(err) {
  if (err) {
    if (debug)
      console.log('Writing ' + file + ' failed.');
  }
  else {
    if (debug)
      console.log('Writing ' + file + ' worked.');      
    returnData.success = true;
    returnData.results[ result.itemId ] = result;
    console.log( price, maxPrice, !fs.existsSync( file ) );
    console.log('success');
  }
})

fs.writeFile是异步的,如果 OP 循环遍历结果列表,那么resultinreturnData.results[ result.itemId ] = result将始终引用循环的最后一个元素,无论该元素是否匹配条件if ( price < maxPrice && price > 40 ) {

于 2019-05-31T15:49:33.137 回答