Saat ini saya sedang mencoba untuk memodifikasi Cloud Functions saya dan pindah di bawah https.onRequest sehingga saya dapat menelepon menggunakannya untuk menjadwalkan pekerjaan cron. Bagaimana saya mendapatkan kesalahan berikut di log.

TypeError: admin.database.ref bukan fungsi di export.scheduleSendNotificationMessageJob.functions.https.onRequest (/user_code/index.js:30:20) di cloudFunction (/user_code/node_modules/firebase-functions/lib/providers/https.js:57:9)

exports.scheduleSendNotificationMessageJob = functions.https.onRequest((req, res) => {
    admin.database.ref('/notifications/{studentId}/notifications/{notificationCode}')
        .onCreate((dataSnapshot, context) => {
            const dbPath = '/notifications/' + context.params.pHumanId + '/fcmCode';
            const promise = admin.database().ref(dbPath).once('value').then(function(tokenSnapshot) {
                const theToken = tokenSnapshot.val();
                res.status(200).send(theToken);
                const notificationCode = context.params.pNotificationCode;
                const messageData = {notificationCode: notificationCode};
                const theMessage = {    data: messageData,
                    notification: { title: 'You have a new job reminder' }
                };
                const options = {   contentAvailable: true,
                    collapseKey: notificationCode };
                const notificationPath = '/notifications/' + context.params.pHumanId + '/notifications/' + notificationCode;
                admin.database().ref(notificationPath).remove();
                return admin.messaging().sendToDevice(theToken, theMessage, options);
            });
            return null;
        });
});
0
sk123 26 Maret 2019, 16:41

1 menjawab

Jawaban Terbaik

Anda tidak dapat menggunakan definisi onCreate() pemicu Realtime Database dalam definisi HTTP Cloud Function.

Jika Anda beralih ke HTTP Cloud Function "agar (Anda) dapat memanggil menggunakannya untuk menjadwalkan tugas cron" itu berarti pemicunya adalah panggilan ke HTTP Cloud Function. Dengan kata lain, Anda tidak akan lagi dapat memicu tindakan (atau Cloud Function) saat data baru dibuat di Realtime Database.

Yang dapat Anda lakukan adalah membaca data Realtime Database, sebagai berikut, misalnya (skenario pengiriman notifikasi yang disederhanakan):

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

    //get the desired values from the request
    const studentId = req.body.studentId;
    const notificationCode = req.body.notificationCode;

    //Read data with the once() method
    admin.database.ref('/notifications/' + studentId + '/notifications/' + notificationCode)
     .once('value')
     .then(snapshot => {
         //Here just an example on how you would get the desired values
         //for your notification
         const theToken = snapshot.val();
         const theMessage = ....
         //......

         // return the promise returned by the sendToDevice() asynchronous task
         return admin.messaging().sendToDevice(theToken, theMessage, options)
      })
      .then(() => {
         //And then send back the result (see video referred to below)
         res.send("{ result : 'message sent'}") ;
      })
      .catch(err => {
         //........
      });

});

Anda dapat menonton video resmi Firebase berikut tentang HTTP Cloud Functions: https ://www.youtube.com/watch?v=7IkUgCLr5oA&t=1s&list=PLl-K7zZEsYLkPZHe41m4jfAxUi0JjLgSM&index=3. Ini menunjukkan cara membaca data dari Firestore tetapi konsep membaca dan mengirim kembali respons (atau kesalahan) sama untuk Realtime Database. Bersama dengan 2 video seri lainnya (https://firebase .google.com/docs/functions/video-series/?authuser=0), ini juga menjelaskan betapa pentingnya untuk mengikat janji dengan benar dan menunjukkan ke platform bahwa pekerjaan Cloud Function telah selesai.

3
Renaud Tarnec 26 Maret 2019, 16:20