Firebase云功能-错误:Reference.child失败:第一个参数是无效路径

时间:2020-09-02 12:17:00

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

我正在尝试使用本教程https://www.youtube.com/watch?v=z27IroVNFLI

来使推送通知生效

它显然有些陈旧,但是Firebase Web应用程序没有很多好的选择。

我的云函数运行时出现以下错误:

fcmSend

错误:Reference.child失败:第一个参数是无效路径=“ / fcmTokens / [对象对象]”。路径必须是非空字符串,并且在validatePathString(/srv/node_modules/@firebase/database/dist/index.node处不能包含“。”,“#”,“ $”,“ [”或“]” .cjs.js:1636:15)位于Reference.child(/ srv / node_modules / @ firebase / database)的validateRootPathString(/srv/node_modules/@firebase/database/dist/index.node.cjs.js:1647:5) /dist/index.node.cjs.js:13688:17)在export.fcmSend.functions上的Database.ref(/srv/node_modules/@firebase/database/dist/index.node.cjs.js:14862:48) .database.ref.onWrite(/srv/index.js:21:12)位于/worker/worker.js处的cloudFunction(/srv/node_modules/firebase-functions/lib/cloud-functions.js:131:23): 825:24 at process._tickDomainCallback(internal / process / next_tick.js:229:7)

这是云端功能:

exports.fcmSend = functions.database
                           .ref('/model_outputs/real_estate')
                           .onWrite((change, context) => {

    const userId  = change.after.val();
    console.log(change);
    const payload = {
          notification: {
            title: "test",
            body: "test body",
            icon: "https://placeimg.com/250/250/people"
          }
        };
  
  
     admin.database()
          .ref(`/fcmTokens/${userId}`)
          .once('value')
          .then(token => token.val() )
          .then(userFcmToken => {
            return admin.messaging().sendToDevice(userFcmToken, payload)
          })
          .then(res => {
            console.log("Sent Successfully", res);
            return null;
          })
          .catch(err => {
            console.log(err);
          });
  
  });

我已经看到其他人发布了有关此错误的信息,但是当他们使用而不是s in this case: admin.database()。ref(/fcmTokens/${userId})`时,大多数人不得不这样做。如您所见,我正在使用刻度线,所以我不确定这里出了什么问题。

以下是我的数据库中数据的结构: enter image description here

很明显,我砍掉了ID,但我只是想说明它是嵌套在/fcmTokens下的。

1 个答案:

答案 0 :(得分:2)

您的Cloud Function中似乎存在几个问题:

#1

由于userId不是字符串,因此以下行会产生错误。

admin.database().ref(`/fcmTokens/${userId}`)

'/model_outputs/real_estate'处的DB节点的值很可能是一个对象,因此,当您执行const userId = change.after.val();时,会将一个对象分配给userId

按照上面的评论进行更新:似乎您为undefined获得了userId。您需要调试并解决此问题:它必须是字符串。

#2

以下诺言链是错误的:

admin.database()
      .ref(`/fcmTokens/${userId}`)
      .once('value')
      .then(token => token.val() )  // You don't return anything here, and not a Promise
      .then(userFcmToken => {
        return admin.messaging().sendToDevice(userFcmToken, payload)
      })
      .then(res => {
        console.log("Sent Successfully", res);
        return null;
      })
      .catch(err => {
        console.log(err);
      });

如果我正确理解了您的逻辑和数据模型,应该遵循以下几点:

admin.database()
      .ref(`/fcmTokens/${userId}`)
      .once('value')
      .then(snapshot => { 
        const userFcmToken = snapshot.val();
        return admin.messaging().sendToDevice(userFcmToken, payload)
      })
      .then(res => {
        console.log("Sent Successfully", res);
        return null;
      })
      .catch(err => {
        console.log(err);
      });