1

我正在使用單個Firebase功能向我的Android用戶發送多個推送通知。在每次執行中發送多個推送通知的Firebase函數中返回*的內容?

每個通知的詳細信息都將寫入我的Firebase數據庫中應該發送的日期和時間。我使用cron通過http請求啓動Firebase功能。

我的問題是Firebase功能應該返回以完成循環所有Firebase節點(代表通知)並完成發送所有通知?

這就是我現在擁有的。它在發送第一個通知後退出。我想要的是完成查看所有Firebase子節點併爲每個節點發送通知。

我不明白Promises的想法足以找出在多個推送通知的情況下返回什麼。這也沒有幫助,我幾乎完全忘記了如何編寫JavaScript。

exports.sendHourlyNotifications = functions.https.onRequest((req, res) => { 
    const dateStr = req.query.date; 
    const hourStr = req.query.hour; 
    console.log('sendHourlyNotifications', 'date: ' + dateStr + " hour: " + hourStr); 
    const parentRef = admin.database().ref(); 
    const notifRef = parentRef.child('all-notifications'); 
    const hourRef = notifRef.child(dateStr).child(hourStr); 
    return hourRef.once('value').then(snapshot => { 
     const updates = {}; 
     snapshot.forEach(function(childSnapshot) { 
     const deviceToken = childSnapshot.child("deviceToken").val(); 
     console.log('sendHourlyNotifications', 'childSnapshot Key: ' + childSnapshot.key); 
     const title = childSnapshot.child("title").val(); 
     const body = childSnapshot.child("body").val(); 

     console.log('sendHourlyNotifications', "DeviceToken: " + deviceToken + " Title: " + title + " Body: " + body); 

      var payload = { 
       notification: { 
        title: title, 
        body: body, 
       } 
       }; 

      admin.messaging().sendToDevice(deviceToken, payload); 

      return Promise.all([ 
      /* ... */ 
      ]).then(() => { 
      res.status(200).send('ok'); 
      }).catch(err => { 
      console.log(err.stack); 
      res.status(500).send('error'); 
      }); 
     }); 
     return parentRef.update(updates); 
    }); 
}); 

如果無法在火力地堡功能的同一個執行多個發送推送通知,那麼我想我將不得不重新構建了一下。如果是這種情況,我歡迎任何提示或示例鏈接,以獲得更好的設計。

回答

3

由於此功能是由HTTP請求觸發的,因此您不需要返回頂級函數中的任何內容。只要您致電send,該功能即被視爲已完成。

所以,你需要做的是重構代碼只調用send()您發送的所有通知後:

return hourRef.once('value').then(snapshot => { 
    var promises = []; 
    snapshot.forEach(function(childSnapshot) { 
    const deviceToken = childSnapshot.child("deviceToken").val(); 
    const title = childSnapshot.child("title").val(); 
    const body = childSnapshot.child("body").val(); 

    var payload = { 
     notification: { 
      title: title, 
      body: body, 
     } 
     }; 
    promises.push(admin.messaging().sendToDevice(deviceToken, payload)); 

    }); 
    // The res.send() needs to be outside of the snapshot.forEach() callback 
    Promise.all(promises).then(() => { 
    res.status(200).send('ok'); 
    }).catch(err => { 
    console.log(err.stack); 
    res.status(500).send('error'); 
    }); 

}); 

如果你是「新」爲JavaScript,爲火力地堡雲功能不學習它的最好方法。我建議首先閱讀Firebase documentation for Web developers和/或採取Firebase codelab for Web developer。它們涵蓋了許多基本的JavaScript,Web和Firebase交互。您也可以在本地Node.js進程中使用Admin SDK,該進程可以使用本地調試器進行調試。在這之後,你將會更好地爲雲功能編寫代碼。

+0

完美的作品,謝謝!這也很有道理。由於我現在更像是一個Android開發人員而不是Web Dev,因此我跳過了這些資源 - 但在我嘗試使用更多雲功能之前,我會回頭閱讀這些資源:) –