Android Firebase函数-设备令牌为空

Android Firebase函数-设备令牌为空,android,node.js,firebase,firebase-realtime-database,Android,Node.js,Firebase,Firebase Realtime Database,我需要帮助,我整天都在寻找解决方案,但我无法解决我的问题,下面的代码无法读取设备令牌 下面是我的数据库结构。我成功地收到了日志:“我们有一条新消息要告诉你。”当我添加一篇新帖子时,我收到了日志“没有要发送的通知令牌。”,这意味着它无法检测到设备令牌,即使已经有了。我做错了什么 { “新闻V2”:{ “全部”:{ “-KTR7ZKUCHCHUIMB_4f”:{ “名称”:“名称”, “类型”:“, } }, “Usersv2”:{ “h0RzzpdO7nZVLpAR4fi7xRWUqsT2”:{

我需要帮助,我整天都在寻找解决方案,但我无法解决我的问题,下面的代码无法读取设备令牌

下面是我的数据库结构。我成功地收到了日志:“我们有一条新消息要告诉你。”当我添加一篇新帖子时,我收到了日志“没有要发送的通知令牌。”,这意味着它无法检测到设备令牌,即使已经有了。我做错了什么

{
“新闻V2”:{
“全部”:{
“-KTR7ZKUCHCHUIMB_4f”:{
“名称”:“名称”,
“类型”:“,
}
},
“Usersv2”:{
“h0RzzpdO7nZVLpAR4fi7xRWUqsT2”:{
“设备\u令牌”:“”,
“名称”:“,
“用户号”:”
}
},
}
/--新闻
--全部
--名字
--描述
/--用户SV2
--{userID}
--设备令牌
exports.sendNotif=functions.database.ref('/Newsv2/All/{newsID}').onWrite(事件=>{
const newsID=event.params.newsID;
const userID=event.params.userID;
如果(!event.data.val()){
返回console.log('News!',newsID);
}
log(“我们有一条新消息要告诉你!”,newsID);
//获取设备通知令牌的列表。
const getDeviceTokenPromise=admin.database().ref(`/Usersv2/${userid}/device_-token`)。once('value');
返回承诺。全部([GetDeviceTokenPromise])。然后(结果=>{
const tokensSnapshot=结果[0];
//const follower=结果[1];
//检查是否有任何设备令牌。
如果(!tokensSnapshot.hasChildren()){
return console.log('没有要发送的通知令牌');
}
log('There',tokensSnapshot.numChildren(),'tokens to send notification to');
//console.log('Fetched follower profile',follower);
//通知详情。
常数有效载荷={
通知:{
标题:“测试消息”,
正文:“”,
图标:“”
}
};
//列出所有令牌。
const tokens=Object.keys(tokensSnapshot.val());
//向所有令牌发送通知。
返回admin.messaging(){
//对于每条消息,检查是否有错误。
常量tokensToRemove=[];
response.results.forEach((结果,索引)=>{
常量错误=result.error;
如果(错误){
console.error('Failure sending notification to',tokens[index],error);
//清理不再注册的令牌。
if(error.code==='消息传递/无效注册令牌'||
error.code===“未注册消息传递/注册令牌”){
tokensToRemove.push(tokensSnapshot.ref.child(tokens[index]).remove());
}
}
});
归还承诺。全部(tokensToRemove);
});
});

});
要获取设备令牌,当用户注册或登录时,我将其存储在firebase DB中

    private DatabaseReference mUserDatabase;
    mUserDatabase = FirebaseDatabase.getInstance().getReference().child("Users/");
    //and if the login/register is successful
    mUserDatabase.child("device_token").setValue(deviceToken).addOnSuccessListener(new OnSuccessListener<Void>() {
                                                    @Override
                                                    public void onSuccess(Void aVoid) {
                                                    Intent intent = new Intent(application.getApplicationContext(), MainActivity.class);
                                                    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP |Intent.FLAG_ACTIVITY_NEW_TASK);
                                                    application.startActivity(intent);
                                                }
                                            });

发布创建
getDeviceTokenPromise
的代码。它什么时候运行?对不起,我忘了将它包含在//获取设备通知令牌列表。const getDeviceTokenPromise=admin.database().ref(
/users/${followedUid}/notificationTokens
)一次('value'));您的数据库不具有代码所需的结构或包含的值。若要获得其他帮助,您需要为失败的用户ID发布导出的JSON(带有专用数据的占位符,如令牌)。您可以从Firebase控制台进行导出。{“Newsv2”:{“All”:{“-KtqNC3MTYcJEsAbE3QD”:{“title”:“type”:},},“Usersv2”:{“h0RzzpdO7nZVLpAR4fi7xRWUqsT2”:{“device_token”:“name”:“user_no”:},}是这样吗?您的代码期望
设备\u令牌
有一个或多个子项,其中每个子项的键都是令牌。这不在您的注释中的JSON中。此外,如果JSON被格式化并包含为您问题的编辑,而不是注释,那么JSON将更具可读性。您能再次检查我编辑的问题吗?我放弃了ot以在前面添加该函数。
const deviceToken = admin.database().ref(`/Users/${unique_id}/device_token`).once('value');