1

私はAndroidベースのユーザーに複数のプッシュ通知を送信するために単一のfirebase関数を使用しています。各実行で複数のプッシュ通知を送信するFirebaseファンクションでは何を*返すのですか?

各通知の詳細は、Firebaseデータベースに、送信する必要のある日時に記載されています。私はcronを使ってこのFirebase FunctionをHTTPリクエストで起動します。

すべてのFirebaseノード(通知を表す)をループしてすべての通知を終了するには、Firebaseファンクションが返されます。

これは私が今持っているものです。最初の通知が送信された後に終了します。私が望むのは、すべてのFirebaseの子ノードを調べ、それぞれのノードに通知を送信することです。

私は複数のプッシュ通知の場合に何を返すのか十分に考えているとは思いません。それは私が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); 
    }); 
}); 

それはFirebase機能の同一の実行で複数のプッシュ通知を送信することができない場合は、私は少しを再設計する必要がありますと仮定します。そのような場合は、より良いデザインへのヒントや例のリンクを歓迎します。

答えて

3

この関数はHTTPリクエストによってトリガされるため、トップレベル関数から何も返す必要はありません。 sendに電話すると、その機能は完了したとみなされます。あなたはすべての通知送信した後

だからあなたがする必要がありますものだけをsend()を呼び出すコードをリファクタリングです:あなたはJavaScriptに「新」であれば

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'); 
    }); 

}); 

を、Firebaseためのクラウド機能ではありませんそれを学ぶ最善の方法です。最初にFirebase documentation for Web developersを読んだり、Firebase codelab for Web developerとすることをお勧めします。これらは、多くの基本的なJavaScript、Web、Firebaseの相互作用をカバーしています。またローカルのNode.jsプロセスでAdmin SDKを使用することもできます。ローカルのデバッガでデバッグできます。それらの後には、Cloud関数のコードも書く方がはるかに優れています。

+0

完璧に動作します、ありがとうございます!それは完璧な意味合いも持っています。最近私はAndroid DevのほうがWeb Devよりも多いので、これらのリソースはスキップしました。 –

関連する問題