【问题标题】:Firebase Cloud Functions get data on real time database onCreateFirebase Cloud Functions 在实时数据库 onCreate 上获取数据
【发布时间】:2019-09-25 03:08:22
【问题描述】:
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();

exports.sendNotification = functions.database.ref('/messages/diyetisyen/{uname}/{msgid}/message')
.onCreate((snapshot, context) => {

let message = snapshot.val();
let uname = context.params.uname;
let root = snapshot.ref.root;
let token = root.child('/users/' + uname + '/token').ref.token;

let payload = {
  data: {
    custom_notification: JSON.stringify({
      body: message + '',
      title: 'aaaa'

    })
  }
};
let options = { priority: "high" };


return admin
  .messaging()
  .sendToDevice(token, payload, options);
  });

我无法在 /users/{uname}/token -> 值上获取令牌。


错误:提供给 sendToDevice() 的注册令牌必须是非空字符串或非空数组。 在 FirebaseMessagingError.FirebaseError [作为构造函数] (/srv/node_modules/firebase-admin/lib/utils/error.js:42:28) 在 FirebaseMessagingError.PrefixedFirebaseError [作为构造函数] (/srv/node_modules/firebase-admin/lib/utils/error.js:88:28) 在新的 FirebaseMessagingError (/srv/node_modules/firebase-admin/lib/utils/error.js:253:16) 在 Messaging.validateRegistrationTokensType (/srv/node_modules/firebase-admin/lib/messaging/messaging.js:911:19) 在 Messaging.sendToDevice (/srv/node_modules/firebase-admin/lib/messaging/messaging.js:532:14) 在exports.sendNotification.functions.database.ref.onCreate (/srv/index.js:28:5) 在 cloudFunctionNewSignature (/srv/node_modules/firebase-functions/lib/cloud-functions.js:120:23) 在 /worker/worker.js:825:24 在 在 process._tickDomainCallback (internal/process/next_tick.js:229:7)

【问题讨论】:

    标签: node.js firebase-realtime-database firebase-cloud-messaging google-cloud-functions


    【解决方案1】:

    你不能通过做得到一个数据库节点的值

    let token = root.child('/users/' + uname + '/token').ref.token;
    

    需要用Referenceonce()方法查询数据库,是异步的。

    这意味着你必须修改你的代码如下:

    exports.sendNotification = functions.database.ref('/messages/diyetisyen/{uname}/{msgid}/message')
    .onCreate((snapshot, context) => {
    
        let message = snapshot.val();
        let uname = context.params.uname;
        let root = snapshot.ref.root;
        let tokenRef = root.child('/users/' + uname + '/token').ref;
    
        let payload = {
           data: {
             custom_notification: JSON.stringify({
               body: message + '',
               title: 'aaaa'   
             })
           }
         };
    
         let options = { priority: "high" };
    
         return tokenRef.once('value')
         .then(dataSnapshot => {
           const data = dataSnapshot.val();
           const token = data.token;   //Here I make the assumption the token is at '/users/' + uname + '/token/token'. You may adapt it as required
    
           return admin
           .messaging()
           .sendToDevice(token, payload, options);
         }); 
    });  
    

    【讨论】:

      猜你喜欢
      • 2019-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-13
      • 2018-12-22
      • 2017-10-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多