我正在尝试使用本教程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}
)`时,大多数人不得不这样做。如您所见,我正在使用刻度线,所以我不确定这里出了什么问题。
很明显,我砍掉了ID,但我只是想说明它是嵌套在/fcmTokens
下的。
答案 0 :(得分:2)
您的Cloud Function中似乎存在几个问题:
由于userId
不是字符串,因此以下行会产生错误。
admin.database().ref(`/fcmTokens/${userId}`)
'/model_outputs/real_estate'
处的DB节点的值很可能是一个对象,因此,当您执行const userId = change.after.val();
时,会将一个对象分配给userId
按照上面的评论进行更新:似乎您为undefined
获得了userId
。您需要调试并解决此问题:它必须是字符串。
以下诺言链是错误的:
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);
});