Javascript 在运行嵌套查询的嵌套对象上使用firebase cloud函数搜索数据时未指定索引
我使用fire base检索用户节点的嵌套数据,在运行查询时,我遇到了从fire base数据库获取数据的问题 考虑在以下位置添加“.indexOn”:“userId” /users/YJdwgRO08nOmC5HdEokr1NqcATx1/following/users到您的安全 提高性能的规则 数据库结构:Javascript 在运行嵌套查询的嵌套对象上使用firebase cloud函数搜索数据时未指定索引,javascript,node.js,firebase,firebase-realtime-database,Javascript,Node.js,Firebase,Firebase Realtime Database,我使用fire base检索用户节点的嵌套数据,在运行查询时,我遇到了从fire base数据库获取数据的问题 考虑在以下位置添加“.indexOn”:“userId” /users/YJdwgRO08nOmC5HdEokr1NqcATx1/following/users到您的安全 提高性能的规则 数据库结构: "users" : { "1vWvSXDQITMmKdUIY7SYoLA1MgU2" : { "userEmail" : "test2kawee@gmail.com
"users" : {
"1vWvSXDQITMmKdUIY7SYoLA1MgU2" : {
"userEmail" : "test2kawee@gmail.com",
"userId" : "1vWvSXDQITMmKdUIY7SYoLA1MgU2",
"userName" : "Malik Abdul Kawee",
"userPhoneNumber" : "",
"userProfileImage" : "https://pbs.twimg.com/profile_images/1018741325875867648/ZnKeUiOJ_400x400.jpg"
},
"YJdwgRO08nOmC5HdEokr1NqcATx1" : {
"following" : {
"1vWvSXDQITMmKdUIY7SYoLA1MgU2" : {
"currentFollowingUserId" : "YJdwgRO08nOmC5HdEokr1NqcATx1",
"userEmail" : "test2kawee@gmail.com",
"userId" : "1vWvSXDQITMmKdUIY7SYoLA1MgU2",
"userName" : "Malik Abdul Kawee",
"userPhoneNumber" : "",
"userProfileImage" : "https://pbs.twimg.com/profile_images/1018741325875867648/ZnKeUiOJ_400x400.jpg"
}
},
"userEmail" : "test2atif@gmail.com",
"userId" : "YJdwgRO08nOmC5HdEokr1NqcATx1",
"userName" : "Atif AbbAsi",
"userPassword" : "test123",
"userPhoneNumber" : "",
"userProfileImage" : "http://paperlief.com/images/enrique-iglesias-body-workout-wallpaper-4.jpg"
}
}
"users": {
".indexOn": ["userId","currentFollowingUserId",".value"],
"$userId": {
"following": {
//"$userId": {
".indexOn": ["userId","currentFollowingUserId",".value"]
}
//}
}
}
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
exports.sendFollowingNotifications = functions.database.ref('/users/{userId}/following/{followingId}')
//.onWrite(event => {
.onCreate((snap,context) => {
console.info("Child value is val() " ,snap);
var childNodeValue=snap.val();
var topic=childNodeValue.userId;
//var ref = firebase.database().ref.child('users');
//console.log("testing ref pathName : " ,snap.ref.parent.parent.parent.pathname);
// console.log("testing ref : " ,snap.ref.parent.parent.parent.path);
//var ref = admin.database().ref("users");
//.child('users')
return snap.ref.parent.parent.parent.orderByChild("userId").equalTo(childNodeValue.currentFollowingUserId)
// .on('child_changed').then(snapshot => { once('value')
.once('value', function(snapshot){
var parentNodeValue=snapshot.val();
console.info("Topic ID " ,topic);
console.info("Parent value is val() " ,snapshot.val());
var payload = {
data: {
username: parentNodeValue.userName,
imageurl:parentNodeValue.userProfileImage,
description:"Started Following You"
}
};
// Send a message to devices subscribed to the provided topic.
return admin.messaging().sendToTopic(topic, payload)
.then(function (response) {
// See the MessagingTopicResponse reference documentation for the
// contents of response.
console.log("Successfully sent message:", response);
return response;
})
.catch(function (error) {
console.log("Error sending message:", error);
return error;
});
});
});
数据库规则:
"users" : {
"1vWvSXDQITMmKdUIY7SYoLA1MgU2" : {
"userEmail" : "test2kawee@gmail.com",
"userId" : "1vWvSXDQITMmKdUIY7SYoLA1MgU2",
"userName" : "Malik Abdul Kawee",
"userPhoneNumber" : "",
"userProfileImage" : "https://pbs.twimg.com/profile_images/1018741325875867648/ZnKeUiOJ_400x400.jpg"
},
"YJdwgRO08nOmC5HdEokr1NqcATx1" : {
"following" : {
"1vWvSXDQITMmKdUIY7SYoLA1MgU2" : {
"currentFollowingUserId" : "YJdwgRO08nOmC5HdEokr1NqcATx1",
"userEmail" : "test2kawee@gmail.com",
"userId" : "1vWvSXDQITMmKdUIY7SYoLA1MgU2",
"userName" : "Malik Abdul Kawee",
"userPhoneNumber" : "",
"userProfileImage" : "https://pbs.twimg.com/profile_images/1018741325875867648/ZnKeUiOJ_400x400.jpg"
}
},
"userEmail" : "test2atif@gmail.com",
"userId" : "YJdwgRO08nOmC5HdEokr1NqcATx1",
"userName" : "Atif AbbAsi",
"userPassword" : "test123",
"userPhoneNumber" : "",
"userProfileImage" : "http://paperlief.com/images/enrique-iglesias-body-workout-wallpaper-4.jpg"
}
}
"users": {
".indexOn": ["userId","currentFollowingUserId",".value"],
"$userId": {
"following": {
//"$userId": {
".indexOn": ["userId","currentFollowingUserId",".value"]
}
//}
}
}
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
exports.sendFollowingNotifications = functions.database.ref('/users/{userId}/following/{followingId}')
//.onWrite(event => {
.onCreate((snap,context) => {
console.info("Child value is val() " ,snap);
var childNodeValue=snap.val();
var topic=childNodeValue.userId;
//var ref = firebase.database().ref.child('users');
//console.log("testing ref pathName : " ,snap.ref.parent.parent.parent.pathname);
// console.log("testing ref : " ,snap.ref.parent.parent.parent.path);
//var ref = admin.database().ref("users");
//.child('users')
return snap.ref.parent.parent.parent.orderByChild("userId").equalTo(childNodeValue.currentFollowingUserId)
// .on('child_changed').then(snapshot => { once('value')
.once('value', function(snapshot){
var parentNodeValue=snapshot.val();
console.info("Topic ID " ,topic);
console.info("Parent value is val() " ,snapshot.val());
var payload = {
data: {
username: parentNodeValue.userName,
imageurl:parentNodeValue.userProfileImage,
description:"Started Following You"
}
};
// Send a message to devices subscribed to the provided topic.
return admin.messaging().sendToTopic(topic, payload)
.then(function (response) {
// See the MessagingTopicResponse reference documentation for the
// contents of response.
console.log("Successfully sent message:", response);
return response;
})
.catch(function (error) {
console.log("Error sending message:", error);
return error;
});
});
});
函数查询:
"users" : {
"1vWvSXDQITMmKdUIY7SYoLA1MgU2" : {
"userEmail" : "test2kawee@gmail.com",
"userId" : "1vWvSXDQITMmKdUIY7SYoLA1MgU2",
"userName" : "Malik Abdul Kawee",
"userPhoneNumber" : "",
"userProfileImage" : "https://pbs.twimg.com/profile_images/1018741325875867648/ZnKeUiOJ_400x400.jpg"
},
"YJdwgRO08nOmC5HdEokr1NqcATx1" : {
"following" : {
"1vWvSXDQITMmKdUIY7SYoLA1MgU2" : {
"currentFollowingUserId" : "YJdwgRO08nOmC5HdEokr1NqcATx1",
"userEmail" : "test2kawee@gmail.com",
"userId" : "1vWvSXDQITMmKdUIY7SYoLA1MgU2",
"userName" : "Malik Abdul Kawee",
"userPhoneNumber" : "",
"userProfileImage" : "https://pbs.twimg.com/profile_images/1018741325875867648/ZnKeUiOJ_400x400.jpg"
}
},
"userEmail" : "test2atif@gmail.com",
"userId" : "YJdwgRO08nOmC5HdEokr1NqcATx1",
"userName" : "Atif AbbAsi",
"userPassword" : "test123",
"userPhoneNumber" : "",
"userProfileImage" : "http://paperlief.com/images/enrique-iglesias-body-workout-wallpaper-4.jpg"
}
}
"users": {
".indexOn": ["userId","currentFollowingUserId",".value"],
"$userId": {
"following": {
//"$userId": {
".indexOn": ["userId","currentFollowingUserId",".value"]
}
//}
}
}
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
exports.sendFollowingNotifications = functions.database.ref('/users/{userId}/following/{followingId}')
//.onWrite(event => {
.onCreate((snap,context) => {
console.info("Child value is val() " ,snap);
var childNodeValue=snap.val();
var topic=childNodeValue.userId;
//var ref = firebase.database().ref.child('users');
//console.log("testing ref pathName : " ,snap.ref.parent.parent.parent.pathname);
// console.log("testing ref : " ,snap.ref.parent.parent.parent.path);
//var ref = admin.database().ref("users");
//.child('users')
return snap.ref.parent.parent.parent.orderByChild("userId").equalTo(childNodeValue.currentFollowingUserId)
// .on('child_changed').then(snapshot => { once('value')
.once('value', function(snapshot){
var parentNodeValue=snapshot.val();
console.info("Topic ID " ,topic);
console.info("Parent value is val() " ,snapshot.val());
var payload = {
data: {
username: parentNodeValue.userName,
imageurl:parentNodeValue.userProfileImage,
description:"Started Following You"
}
};
// Send a message to devices subscribed to the provided topic.
return admin.messaging().sendToTopic(topic, payload)
.then(function (response) {
// See the MessagingTopicResponse reference documentation for the
// contents of response.
console.log("Successfully sent message:", response);
return response;
})
.catch(function (error) {
console.log("Error sending message:", error);
return error;
});
});
});
返回
snap.ref.parent.child('users').orderByChild('userId').equalTo(childNodeValue.currentFollowUserid)
我认为问题在于这个查询,我对以下节点的第一个查询返回了我的数据,但是当我检索其父节点用户的数据时,我得到了警告
我试图使用functions.database.ref
,但它给出了以下异常
so I tried using this `snap.ref.parent.`to get reference of parent node.
Firebase函数,admin.database().ref(…)不是函数
Firebase函数,Functions.database().ref(…)不是函数
您在阅读用户时得到了错误的参考。您需要执行以下操作才能获得正确的引用:
snap.ref.parent.parent.parent
(ref现在将位于/users)。您的查询正在尝试读取以下项下的用户节点
警告是,您需要编写firebase规则以启用基于用户ID的索引,否则操作将占用大量带宽
以下是将添加索引的规则:
"users": {
"$uid" : {
".indexOn" : ["userId"]
}
}
以下是有关数据库规则的更多信息的资源:
这是firebase的一个简单工具,可以轻松编写规则:
附言:你回复了两个承诺,你上次发送通知的承诺将不起作用。使用firebase查询嵌套或链接它。还可以通过将('child_changed')上的
更改为一次('value')
来创建查询单值事件 错误消息末尾有一个尾随的users
,这在JSON和规则中缺失。似乎您正在查询不存在的数据。@FrankvanPuffelen我认为这行返回snap.ref.parent.child(“用户”)的问题是,从以下节点获取数据后,我试图获取其父节点,但我不知道如何获取父节点,所以,我只是尝试使用snap.ref.parent。snap.ref.parent.parent
?尽管我认为您可能正在寻找snap.ref.root
。查看参考文档了解数据库的所有属性参考
:感谢@FrankvanPuffelen snap.ref.parent.parent.parent为我工作。查看数据库结构umar..我使用嵌套查询问题在于返回snap.ref.parent.child(“用户”)此查询。请参阅我的更新答案。在函数内部查询时,引用错误。是否有方法将引用打印为字符串。?与***/user/valueref类似,它是firebase sdk中的一个引用接口,并具有一个变量path
,用于获取作为路径的引用。发送消息时出错:{Error:Messaging payload包含“data.userName”属性的无效值。值必须是字符串。如何解决此问题。?