Многократный запрос HTTP POST не возвращает ответы соответственно - PullRequest
0 голосов
/ 27 января 2020

Я пытаюсь получить сотни (может быть, тысячи в будущем) ответа HTTP-запроса POST здесь путем итерации базы данных. Я не получаю ответы на большое количество запросов, но когда я использую это только для нескольких запросов, я получаю ответы отлично. Можете ли вы объяснить, как я могу получить все ответы? заранее спасибо.

async function getDataFromDB(){
var allPromise = [];
var i = 0;

let d1 = new Date;
let utc1 = d.getTime() + (d.getTimezoneOffset() * 60000);
let myDate1 = new Date(utc + (3600000*(+6.0)));
myDate1 = myDate1.toString();
return ref.on('value',function(snapshot){
    snapshot.forEach(function(childSnapshot){
        var childData = childSnapshot.val();
        allPromise.push(callbackFunction(childSnapshot.key, childData['ReceiptData'], myDate1));
    });
    Promise.all(allPromise)
    .then((result) =>{
        for (i = 0; i < allPromise.length; i++) {
            parseData(ids[i], result[i], myDate1);
        }
        return result;
    })
    .catch((err) =>{
        console.log("promise error :"+err);
    });
    console.log("done");

  });
}
let callbackFunction = function(userID, receiptData, myDate){
console.log("from callback");
return new Promise(function(resolve, reject){
    setTimeout(()=>{
        let password = 'my_password';
    const data = JSON.stringify({
            'receipt-data': receiptData,
            'password' : password,
            'exclude-old-transactions': false
        });
        const options = {
            resolveWithFullResponse: true,
            hostname: 'buy.itunes.apple.com',
            port: 443,
            path: '/verifyReceipt',
            method: 'POST',
            json: true,
            headers: {
                'Content-Type': 'application/json',
            }
        };
        try{
            const req = https.request(options, res => {
            myStatusCode[0] = res.statusCode;
            var body = '';

            console.log(`statusCode : ${res.statusCode} : ${userID}`);
            res.on('data', d => {
                body = body + d;                
            });
            res.on('end', () => {
                body = JSON.parse(body);
                console.log("body keys = " + body.keys);
                resolve(body);
            });
            res.on("error", err => {
                console.error("request error : "+err);
                reject(err);
            });
        });
        req.write(data);
        req.end();
        }catch(er){
            console.error("request error : "+ er);
        }
    });
  },1500);
} 

1 Ответ

0 голосов
/ 27 января 2020

Похоже, вы слишком много бьете и параллельно открываете слишком много обещаний. Учитывая, что число будет увеличиваться в будущем, я бы посоветовал их пакетировать и затем отправить.

Как-то так может помочь - https://www.npmjs.com/package/batch-promises

batchPromises(100, snapshot, childSnapshot => {
  const childData = childSnapshot.val();
  return callbackFunction(childSnapshot.key, childData.ReceiptData, myDate1);
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...