繁体   English   中英

Node.js多个异步请求立即失败

[英]Nodejs multiple async requests instantly fail

我一直在为Discord编写一个机器人,由于多个异步响应为空,我发现它失败了。 它似乎只执行8个请求,而忽略其他请求。

运行摘录的代码:

/*Required modules
  npm install request //used because it supports HTTPS
  npm install cheerio
*/
var request = require('request');
var cheerio = require('cheerio');

var ids = [
        "16286",
        "16296",
        "16284",
        "15563",
        "15964",
        "15123",
        "15592",
        "868",
        "15626",
        "15627",
        "339",
        "350"
    ];

var print = "";
var count = 0;
for(var x=0;x<ids.length;x++) {
    request({uri: "https://www.futbin.com" + "/17/player/"+ids[x], gzip: true}, function(error, response, full) {
        let $ = cheerio.load(full);
        var bins = $('.lowest_bin_next_tr');
        var header = $('.player_header').text().trim().split("-");
        console.log(header);
        if(header != '') {
        print += header[1].trim() + ", " + header[0] + "OVR " + $('.pcdisplay-pos').text().trim() + "\r\n";
        print += "**PS4:** " + $('#pslbin').text().slice(0, -1) + ", " + bins.eq(0).text().split("d")[1].trim() + ", " + bins.eq(1).text().split("d")[1].trim() + " " + $('.lowest_bin_updated_tr_ps4').text().trim().substring(8, this.length) + "\r\n";
        print += "**XBOX:** " + $('#xboxlbin').text().slice(0, -1) + ", " + bins.eq(4).text().split("d")[1].trim() + ", " + bins.eq(5).text().split("d")[1].trim() + " " + $('.lowest_bin_updated_tr_xb1').text().trim().substring(8, this.length) + "\r\n"; "\r\n";
        }
        if(++count == ids.length)
            callback(print);
    });
}

由于有12个ID,因此4个请求立即失败。 为什么这只能满足8个请求?

'strict mode';
var async = require('async'),
request = require('request');

var cheerio = require('cheerio');

var ids = [
    "16286",
    "16296",
    "16284",
    "15563",
    "15964",
    "15123",
    "15592",
    "868",
    "15626",
    "15627",
    "339",
    "350"
];

var print = "";

async.eachSeries(ids , idsIteration , finishIteration);

function idsIteration(id , callBack){
    processId(id , callBack);
}


function processId(id , cb){
    request({uri: "https://www.futbin.com" + "/17/player/"+id, gzip: true}, function(error, response, full) {
    if(error){
        console.log('there was error entertainting request :' + error);
        cb(error);
    }
    else {
        var c = cheerio.load(full);
        var bins = c('.lowest_bin_next_tr');
        var header = c('.player_header').text().trim().split("-");
        console.log(header);
        if(header != '') {
        print += header[1].trim() + ", " + header[0] + "OVR " + c('.pcdisplay-pos').text().trim() + "\r\n";
        print += "**PS4:** " + c('#pslbin').text().slice(0, -1) + ", " + bins.eq(0).text().split("d")[1].trim() + ", " + bins.eq(1).text().split("d")[1].trim() + " " + c('.lowest_bin_updated_tr_ps4').text().trim().substring(8, this.length) + "\r\n";
        print += "**XBOX:** " + c('#xboxlbin').text().slice(0, -1) + ", " + bins.eq(4).text().split("d")[1].trim() + ", " + bins.eq(5).text().split("d")[1].trim() + " " + c('.lowest_bin_updated_tr_xb1').text().trim().substring(8, this.length) + "\r\n"; "\r\n";
        }
        cb();
        }
    });
}
function finishIteration(){
    console.log('all ids processed');
}

在我的控制台上输出: 在此处输入图片说明

因此,当我运行您的代码时,要返回的前四个响应会创建一个空的header变量。 的结果:

$('.player_header').text().trim().split("-");

是一个空字符串。

但是,每次运行它,我都会得到一个不同的四个空的。 我认为这是一种服务器端问题,向您发送12个快速启动请求。

在测试中,如果我将请求减慢到每秒一个请求,则所有12个报告数据。 这绝对是服务器端的一个问题,它不喜欢一次获取那么多请求。

这是一个测试代码示例,它将请求减慢到每秒一个的速度,效果很好。 我并不是说这是生产代码,而是想向您展示每秒成功发出一次请求的代码:

/*Required modules
  npm install request //used because it supports HTTPS
  npm install cheerio
*/
var request = require('request');
var cheerio = require('cheerio');

var ids = [
        "16286",
        "16296",
        "16284",
        "15563",
        "15964",
        "15123",
        "15592",
        "868",
        "15626",
        "15627",
        "339",
        "350"
    ];

var print = "";
var count = 0;
ids.forEach(function(id, x) {   
    setTimeout(() => {
        request({uri: "https://www.futbin.com" + "/17/player/"+id, gzip: true}, function(error, response, full) {
            if (error) {
                console.log(error);
            } else {
                let $ = cheerio.load(full);
                var bins = $('.lowest_bin_next_tr');
                console.log(`header data [${id}]`, `"${$('.player_header').text().trim()}"`);
                var header = $('.player_header').text().trim().split("-");
                if(header != '') {
                    print += header[1].trim() + ", " + header[0] + "OVR " + $('.pcdisplay-pos').text().trim() + "\r\n";
                    print += "**PS4:** " + $('#pslbin').text().slice(0, -1) + ", " + bins.eq(0).text().split("d")[1].trim() + ", " + bins.eq(1).text().split("d")[1].trim() + " " + $('.lowest_bin_updated_tr_ps4').text().trim().substring(8, this.length) + "\r\n";
                    print += "**XBOX:** " + $('#xboxlbin').text().slice(0, -1) + ", " + bins.eq(4).text().split("d")[1].trim() + ", " + bins.eq(5).text().split("d")[1].trim() + " " + $('.lowest_bin_updated_tr_xb1').text().trim().substring(8, this.length) + "\r\n"; "\r\n";
                }
                if(++count == ids.length)
                    callback(print);
            }
        });
    }, x * 1000);
});

function callback(data) {
    console.log(data);
}

仅供参考,如果我严格序列化它们(一次在飞行中有一个请求),它也可以这样工作:

/*Required modules
  npm install request //used because it supports HTTPS
  npm install cheerio
*/
var Promise = require('bluebird');
var request = Promise.promisify(require('request'), {multiArgs: true});
var cheerio = require('cheerio');



var ids = [
        "16286",
        "16296",
        "16284",
        "15563",
        "15964",
        "15123",
        "15592",
        "868",
        "15626",
        "15627",
        "339",
        "350"
    ];

Promise.mapSeries(ids, function(id) {
    return request({uri: "https://www.futbin.com" + "/17/player/"+id, gzip: true}).then(function(data) {
        var response = data[0];
        var full = data[1];
        let $ = cheerio.load(full);
        var bins = $('.lowest_bin_next_tr');
        console.log(`header data [${id}]`, `"${$('.player_header').text().trim()}"`);
        var header = $('.player_header').text().trim().split("-");
        let print = "";
        if(header != '') {
            print += header[1].trim() + ", " + header[0] + "OVR " + $('.pcdisplay-pos').text().trim() + "\r\n";
            print += "**PS4:** " + $('#pslbin').text().slice(0, -1) + ", " + bins.eq(0).text().split("d")[1].trim() + ", " + bins.eq(1).text().split("d")[1].trim() + " " + $('.lowest_bin_updated_tr_ps4').text().trim().substring(8, this.length) + "\r\n";
            print += "**XBOX:** " + $('#xboxlbin').text().slice(0, -1) + ", " + bins.eq(4).text().split("d")[1].trim() + ", " + bins.eq(5).text().split("d")[1].trim() + " " + $('.lowest_bin_updated_tr_xb1').text().trim().substring(8, this.length) + "\r\n"; "\r\n";
        }
        return print;
    });
}).then(function(results) {
    console.log(results);
});    

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM