首页 > 解决方案 > 通过 Firebase 函数发送时 FCM 中的高延迟

问题描述

我正在尝试使用 Firebase 函数发送 FCM,这是我正在使用的代码

'use strict';
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();
admin.firestore().settings({
timestampsInSnapshots: true
});
var token = 'token_value';
var sender = 'sender_value';
var reciever = 'reciever_value';
var message = 'message_value';
var payload ='payload_value';
var db = admin.firestore();




exports.sendFollowerNotification = 
functions.database.ref('/m/{messageid}')
   .onCreate((snapshot, context) => {
      console.log('v21');
      message = context.params.messageid;
      console.log('Message Id:', message);

      reciever = snapshot.val().r;
      console.log('Message reciever: ', reciever);
      sender = snapshot.val().s;
      console.log('Message sender: ', sender);
                payload = {
                    data: {
                        id: `${message}`,
                        sender: `${sender}`
                    }


                };
      console.log('Payload Created');



    var tokenRef = db.collection(reciever).doc('t');
    console.log('Fetching Token');
    tokenRef.get()
        .then(doc => {
            console.log('Fetching Token started'); 
            if (!doc.exists) {
                console.log('Token doesnt exist ');
            } else {
                token = doc.data().v;
                console.log('Token data:', token);

            }
            console.log('End Then');
            return token;

        })
        .catch(err => {
            console.log('Error getting token', err);
        }).then((token) => {
            console.log('Sending FCM now');
            admin.messaging().sendToDevice(token,payload);
            return console.log('Successfully sent message:');
        })
        .catch((error) => {
            console.log('Error sending message:', error);
        });



})

问题是 FCM 的接收延迟很大(大约 40 秒),但是从 Firebase 控制台发送的 fcm 几乎立即被接收(大约 2-3 秒)。由于我是一名 android 开发人员并且没有 Node.js 的经验,我认为 JS 代码有问题。通过告诉我什么是错的或可能的解决方法来帮助我。

标签: javascriptnode.jsfirebasefirebase-cloud-messaginggoogle-cloud-functions

解决方案


const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();
admin.firestore().settings({
  timestampsInSnapshots: true
});
var db = admin.firestore();

function debugLogger(msg) {
  // comment out to disable logging
  console.log(msg);
}

function errLogger(err) {
  console.log(err);
}

exports.sendFollowerNotification =
  functions.database.ref('/m/{messageid}')
    .onCreate((snapshot, context) => {
      debugLogger('v23_stackoverflow');
      const message = context.params.messageid;
      debugLogger(`Message Id: ${message}`);

      const reciever = snapshot.val().r;
      debugLogger(`Message reciever: ${reciever}`);
      const sender = snapshot.val().s;
      debugLogger(`Message sender: ${sender}`);
      const payload = {
        data: {
          id: `${message}`,
          sender: `${sender}`
        }
      };
      debugLogger('Payload Created');

      let tokenRef = db.collection(reciever).doc('t');
      debugLogger('Fetching Token');
      return tokenRef.get()
        .then(doc => {
          debugLogger('Fetching Token started');
          if (!doc.exists)
            throw new Error("Token doesnt exist");

          let token = doc.data().v;
          debugLogger(`Token data: ${token}`);
          return token;
        })
        .then(token => {
          debugLogger('Sending FCM now');
          return admin.messaging().sendToDevice(token, payload);
        })
        .then(() => {
          debugLogger('Successfully sent message!');
          return null;
        })
        .catch(err => {
          errLogger(err);
        })
    })

推荐阅读