使用CanonicalRegistrationTokenCount时,Firebase Cloud功能出错

时间:2018-06-02 10:17:34

标签: firebase google-cloud-functions

我正在尝试在注册后向我的应用发送注册通知,并且用户已保存在db中。我正在使用firebase云功能。

我从firebaseinstanceidservice获取了设备令牌并使用路径users/userid/deviceToken将其保存在用户的数据库中,并在函数中引用了此路径,如下所示:

exports.sendNotification = functions.database.ref("users/{userId}/{instanceId_token}")

我已经尝试记录devicetoken以确保但是在云控制台中,我不断获取该日志的其他属性,如:sendNotification deviceToken namesendNotification deviceToken userId而不是db中保存的字母数字值。这条路是错的吗?

这是我的完整代码:

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);

exports.sendNotification = 
functions.database.ref("users/{userId}/{instanceId_token}")
    .onWrite((changes, context) => {
    const userId = context.params.userId;
    console.log("user-id", userId);
    const notificationToken = context.params.instanceId_token;
    console.log("deviceToken", notificationToken);

    var payload = {
      data: {
          title: "Welcome to My Group",
          message: "You may have new messages"
      }
    };
  return admin.messaging().sendToDevice(notificationToken, payload)
      .then(function (response) {
          return console.log("Successfully sent message: ", response);
      })
      .catch(function (error) {
         return console.log("Error sending message: ", error);
      })
  });

此外,该函数在admin.messaging回调后显示此温和的消息:

Successfully sent message:  { results: [ { error: [Object] } ],
   canonicalRegistrationTokenCount: 0,
   failureCount: 1,
   successCount: 0,
   multicastId: 8880906162831350000 }

我如何解决这个问题,我使用的是Android客户端?

这是我的数据库结构: enter image description here

1 个答案:

答案 0 :(得分:1)

您应该在上层节点上触发您的功能,如下所示。并访问instanceId_tokenchanges.after.val()

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);

exports.sendNotification = 
functions.database.ref("users/{userId}")
    .onWrite((changes, context) => {
    const userId = context.params.userId;
    console.log("user-id", userId);
    const notificationToken = changes.after.val().instanceId_token;
    console.log("deviceToken", notificationToken);



    var payload = {
      data: {
          title: "Welcome to My Group",
          message: "You may have new messages"
      }
    };

  return admin.messaging().sendToDevice(notificationToken, payload)
      .catch(function (error) {
         console.log("Error sending message: ", error);
      })
  });

如果您仅在创建用户后添加instanceId_token,则应使用onUpdate()触发(“数据更新时触发”,而onWrite()触发数据时触发创建,更新或删除“)。

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);

exports.sendNotification = 
functions.database.ref("users/{userId}")
    .onUpdate((changes, context) => {
    const userId = context.params.userId;
    console.log("user-id", userId);
    const notificationToken = changes.after.val().instanceId_token;
    console.log("deviceToken", notificationToken);

    if (notificationToken === undefined) {
        console.log("notificationToken === undefined");
      return false;
    } else {

       var payload = {
          data: {
             title: "Welcome to My Group",
             message: "You may have new messages"
         }
       };
      return admin.messaging().sendToDevice(notificationToken, payload)
         .catch(function (error) {
             console.log("Error sending message: ", error);
         })    
       }
  });

另请注意,您不应该

  return admin.messaging().sendToDevice(notificationToken, payload)
      .then(function (response) {
          return console.log("Successfully sent message: ", response);
      })
      .catch(function (error) {
         return console.log("Error sending message: ", error);
      });

因为在这种情况下你没有返回一个“在函数中完成所有异步工作时解析的”。 (参见question的答案)

所以只需返回sendToDevice返回的promise(参见doc),如下所示:

  return admin.messaging().sendToDevice(notificationToken, payload)
      .catch(function (error) {
         console.log("Error sending message: ", error);  // here no return
      });