Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 多个HTTP POST请求没有相应地返回响应_Javascript_Node.js_Firebase_Google Cloud Functions - Fatal编程技术网

Javascript 多个HTTP POST请求没有相应地返回响应

Javascript 多个HTTP POST请求没有相应地返回响应,javascript,node.js,firebase,google-cloud-functions,Javascript,Node.js,Firebase,Google Cloud Functions,我试图在这里通过迭代数据库来检索未来可能有成百上千个http POST请求的响应。我没有收到大量请求的响应,但当我只对少数请求使用此选项时,我会得到完美的响应。你能解释一下我如何确保得到所有的回复吗?提前谢谢 async function getDataFromDB(){ var allPromise = []; var i = 0; let d1 = new Date; let utc1 = d.getTime() + (d.getTimezoneOffset() * 60000); let

我试图在这里通过迭代数据库来检索未来可能有成百上千个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);
} 

看起来你做的太多了,同时也许下了太多的承诺。考虑到这个数字将来会增加,我建议先批量生产,然后再发送过来

像这样的东西可以帮助-


您真的不应该使用实时数据库的on-in-Cloud函数。如果您想一次性获取数据,请使用一次,并利用它返回的承诺。如果您使用的节点是单线程的,则我认为它不适合您的应用程序。使用一次而不是on后,可以解决问题。谢谢。
batchPromises(100, snapshot, childSnapshot => {
  const childData = childSnapshot.val();
  return callbackFunction(childSnapshot.key, childData.ReceiptData, myDate1);
})