在云函数中实现 geofire 的索引错误
Indexing error implementing geofire in cloud function
我在我的应用程序中对工作和用户进行地理定位。我正在我的 index.js 中创建 2 个全局索引,如下所示:
const geousers = new GeoFire(admin.database().ref().child('geolocation').child('users'));
const geojobs = new GeoFire(admin.database().ref().child('geolocation'.child('jobs')));
我在我的函数中做了一个地理查询:
exports.nearbyjobs = functions.database.ref("/users/{userid}/account/l").onWrite((event) => {
const location = event.data;
if (location.child("lat").val() === null || location.child("lng").val() === null) return false;
const uid = event.params.userid;
let lat = Number(location.child("lat").val());
let lng = Number(location.child("lng").val());
const geoQuery = geojobs.query({
center: [lat, lng],
radius: 0.7
});
return admin.database().ref(`users/${uid}/nearbyjobs`).remove().then(data => {
geoQuery.on("key_entered", function(key, location, distance) {
return Promise.all([admin.database().ref(`jobs/${key}/category`).once('value'), admin.database().ref(`users/${uid}/account/categories`).once('value')]).then(r => {
const promises = [];
const cP = r[0];
const cO = r[1];
if (cO.val().includes(cP.val())){
return admin.database().ref(`users/${uid}/nearbyjobs/${key}`).set({
jobkey: key,
distance: distance,
l: location
});
}
});
});
});
});
在我的函数控制台中,我收到警告:
FIREBASE WARNING: Using an unspecified index. Your data will be
downloaded and filtered on the client. Consider adding ".indexOn": "g"
at /geojobs to your security rules for better performance.
地理定位的数据库结构:
geolocation
|
-users
|
+<key>
|
-jobs
|
+<key>
首先,你确定你的数据库的文件名是job吗?根据错误,我猜你已经创建了一个文档存储作为 geojobs。
无论如何,假设您的文档存储名称是 geojobs,这就是您解决上述错误的方法
您必须在 geojobs 下添加规则。转到 Firebase 控制台 --> 数据库 --> 规则。
你会看到类似下面的内容,
{
"rules": {
".read": "auth != null",
".write": "auth != null"
}
}
您必须通过添加 .indexOn
将其更改为以下内容。
{
"rules": {
".read": "auth != null",
".write": "auth != null",
"geojobs": {
".indexOn": ["g"]
}
}
}
我在我的应用程序中对工作和用户进行地理定位。我正在我的 index.js 中创建 2 个全局索引,如下所示:
const geousers = new GeoFire(admin.database().ref().child('geolocation').child('users'));
const geojobs = new GeoFire(admin.database().ref().child('geolocation'.child('jobs')));
我在我的函数中做了一个地理查询:
exports.nearbyjobs = functions.database.ref("/users/{userid}/account/l").onWrite((event) => {
const location = event.data;
if (location.child("lat").val() === null || location.child("lng").val() === null) return false;
const uid = event.params.userid;
let lat = Number(location.child("lat").val());
let lng = Number(location.child("lng").val());
const geoQuery = geojobs.query({
center: [lat, lng],
radius: 0.7
});
return admin.database().ref(`users/${uid}/nearbyjobs`).remove().then(data => {
geoQuery.on("key_entered", function(key, location, distance) {
return Promise.all([admin.database().ref(`jobs/${key}/category`).once('value'), admin.database().ref(`users/${uid}/account/categories`).once('value')]).then(r => {
const promises = [];
const cP = r[0];
const cO = r[1];
if (cO.val().includes(cP.val())){
return admin.database().ref(`users/${uid}/nearbyjobs/${key}`).set({
jobkey: key,
distance: distance,
l: location
});
}
});
});
});
});
在我的函数控制台中,我收到警告:
FIREBASE WARNING: Using an unspecified index. Your data will be downloaded and filtered on the client. Consider adding ".indexOn": "g" at /geojobs to your security rules for better performance.
地理定位的数据库结构:
geolocation
|
-users
|
+<key>
|
-jobs
|
+<key>
首先,你确定你的数据库的文件名是job吗?根据错误,我猜你已经创建了一个文档存储作为 geojobs。 无论如何,假设您的文档存储名称是 geojobs,这就是您解决上述错误的方法 您必须在 geojobs 下添加规则。转到 Firebase 控制台 --> 数据库 --> 规则。
你会看到类似下面的内容,
{
"rules": {
".read": "auth != null",
".write": "auth != null"
}
}
您必须通过添加 .indexOn
将其更改为以下内容。
{
"rules": {
".read": "auth != null",
".write": "auth != null",
"geojobs": {
".indexOn": ["g"]
}
}
}