javascript - 通过 Firebase 功能发送时 FCM 出现高延迟

标签 javascript node.js firebase firebase-cloud-messaging google-cloud-functions

我正在尝试使用 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 代码有问题。请告诉我什么问题或可能的解决方法来帮助我。

最佳答案

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

关于javascript - 通过 Firebase 功能发送时 FCM 出现高延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51854189/

相关文章:

Firebase 存储规则自定义元数据不起作用

javascript - 如何在没有来自 Firebase 的现有数据的情况下只获取新数据?

javascript - 函数未在 setInterval 上运行

javascript - Leaflet::如何检查点位于多边形或矩形的内部/外部

node.js - Passport.js 本地策略-使用用户名登录,使用 token 验证后续请求

node.js - 如何配置通过 Heroku/Node.js 读取的简单静态 AWS S3 图像(403 访问错误)

firebase - 如何在Firebase中创建用户数据的子集合?

javascript - 运行三个桌面环境的最简单方法

javascript - 使用点符号来获取innerHTML或textContent

node.js - 使用 socket.io 管理多个聊天室的正确方法是什么?