Firebase https云功能发送通知始终以超时结束

时间:2017-11-05 14:57:18

标签: firebase google-cloud-functions

Function execution took 60002 ms, finished with status: 'timeout'

我有收集用户产品的云功能&价格数据,点击外部API以获取最新价格,并在价格发生变化时发送通知。我已经阅读了几个类似的问题,例如this,但实际上我已经向客户发送了回复。我已经尝试将超时时间增加到120秒,但它仍然超时。所以,我认为我可能会有一个问题,即我如何回复承诺?有什么建议吗?

这是我的代码:

exports.pushTestWithRP = functions.https.onRequest((req, res) => {

var uidsAndTokens = [];
ref.child('tokens').once('value').then(snap => {
  snap.forEach(childSnap => {
    uidsAndTokens.push({
      uid: childSnap.key,
      deviceToken: childSnap.val()
    });
  });
  return uidsAndTokens;
}).then((uidsAndTokens) => {
    var uidsAndCruises = [];
    ref.child('watchlist-items/users').once('value').then(snap => {
      snap.forEach(childSnap => {
        var uid = childSnap.key;
        childSnap.forEach(childChildSnap => {
          var product = childChildSnap.key;
          var productWatchInfo = childChildSnap.val();
          uidsAndProducts.push({
            uid: uid,
            product: product,
            watchInfo: productWatchInfo
          });
        }); // end childChildSnap
      }); // end childSnap
    return uidsAndProducts;
  }).then((uidsAndProducts) => { // end snap watchlist-items/users

      var uidsOnly = [];
      for (var i=0; i<uidsAndTokens.length; i++) {
        uidsOnly.push(uidsAndTokens[i].uid); 
      }

      // user has a FCM token
      var uidsAndProductsWithTokens = [];
      for (var i=0; i<uidsAndProducts.length; i++) {

        //check if exists in tokens array
        var currUid = uidsAndProducts[i].uid;
        if (uidsOnly.includes(currUid)) {
          //console.log('this uid has a token: ', currUid);
          uidsAndProductsWithTokens.push(uidsAndProducts[i]);
        } else {
          //this uid does NOT have a token
        }  
      } 

      function getTokenForUid(uid) {
        for (var i in uidsAndTokens) {
          if (uidsAndTokens[i].uid == uid) {
            var deviceToken = uidsAndTokens[i].deviceToken;
            break;
          }
        }
        return deviceToken;
      }

      var allPromises = [];
      // call API only for uids with tokens
      for (var i=0; i<uidsAndProductsWithTokens.length; i++) {
        const product = uidsAndProductsWithTokens[i].product;
        const uid = uidsAndProductsWithTokens[i].uid;
        const deviceToken = getTokenForUid(uid);
        const pDates = uidsAndProductsWithTokens[i].watchInfo.pDates;
        const pName = uidsAndProductsWithTokens[i].watchInfo.pName;

        getCurrentPricesFromAPI(product).then((response) => {

          if (typeof response.response != 'undefined') {
            const productId = response.response.product.product_id;
            const allPrices = response.response.prices;

            const promises = [];
            // parse thru prices and send notifications
            for (var date in pDates) {

              // get all current prices and sort by price to get cheapest
              var cheapest = [];
              for (var i = 0; i < allPrices.length; i++) {
                if (allPrices[i].data[productId][date] && allPrices[i].data[productId][date].hasOwnProperty('Inside')) {
                  const iPrice = allPrices[i].data[productId][date].Inside;
                  cheapest.push(iPrice);
                } 

              }
            if (cheapest[0] > 0) {
              cheapest = cheapest.sort(function (a, b) {  return a - b;  });

              if (sDates[date].hasOwnProperty('Inside')) {
                const priceDiff = cheapest[0] - sDates[date].Inside.price;

                if (priceDiff < -10) {
                  const payload = {
                    notification: {
                      title: pName + ' Price DROP Alert!',
                      body: 'prices for the ' + date + ' are $' + cheapest[0] + ' (DOWN $' + Math.abs(priceDiff) + ')',
                      sound: 'default'
                      }
                    };      
                    promises.push(admin.messaging().sendToDevice(deviceToken, payload));
                  } 

                  else if (priceDiff > 10) {
                    const payload = {
                      notification: {
                        title: pName + ' Price Hike Alert',
                        body: 'prices for the ' + date + ' are $' + cheapest[0] + ' (UP $' + priceDiff + ')',
                        sound: 'default'
                        }
                      };      
                      promises.push(admin.messaging().sendToDevice(deviceToken, payload));
                  }

                } 
              } 

            } 
            allPromises = allPromises.concat(promises);   
          } 
    }) // end handle API response
      } // end for loop
      return allPromises;        

    }).then((allPromises) => {
      return Promise.all(allPromises);

      res.send('got tokens and ids');
    }).catch(error => {
      res.send('there was an error');
    });

   }); // end uidsAndTokens
  }); // end function

我无法弄清楚这一点,并希望得到任何帮助!

0 个答案:

没有答案