Firebase 警告:使用 Firebase Cloud Function 搜索数据时使用未指定的索引
Posted
技术标签:
【中文标题】Firebase 警告:使用 Firebase Cloud Function 搜索数据时使用未指定的索引【英文标题】:Firebase warning: Using an unspecified index when search data with Firebase Cloud Function 【发布时间】:2018-11-01 00:13:36 【问题描述】:我构建了一个 Firebase 云函数,用于查找 'IsNotificationEnabled' 值等于 true 的用户。 我的部分功能
export const sendPushNotification = functions.https
.onRequest(async (req, res) =>
try
const message = req.body;
var usersRef = firebase.ref('/Users');
var usersPushNotificationTokensRef = firebase.ref('/PushNotificationTokens')
var listUsersSendNotifications = [],
usersWithTokenSendNotifications = [],
promises = [];
if (message)
await usersRef.orderByChild('IsNotificationEnabled').equalTo(true).once('value', (snapshot) =>
snapshot.forEach((childSnapshot) =>
console.log(childSnapshot.key)
listUsersSendNotifications.push(childSnapshot.key)
return false;
)
)
..........................
正如您在此处看到的,我正在寻找 IsNotificationEnabled = true 的用户。当我运行它时,我会进入日志
[2018-05-22T09:12:57.352Z] @firebase/数据库:FIREBASE 警告: 使用未指定的索引。您的数据将被下载和过滤 在客户端。考虑添加 ".indexOn": "IsNotificationEnabled" 在 /用户遵守您的安全规则以获得更好的性能。
我在 firebase 控制台中插入的规则
"rules":
".indexOn": ["IsNotificationEnabled"],
"Users":
"$uid":
".indexOn": ["IsNotificationEnabled"],
".write": "$uid === auth.uid",
".read": "$uid === auth.uid"
,
".read": true,
".write": true
【问题讨论】:
我在你的问题中遗漏了这个问题。但是 indexon 不需要更高一级吗?在用户下方而不是 $uid。 我的问题,为什么我会收到这个错误以及如何解决它。我编辑了我的帖子并添加了用户结构的图像 您是否尝试将索引放在用户下方而不是 $uid 下方? 是的,现在可以使用了。谢谢你,先生。 【参考方案1】:如消息所述,您需要将索引添加到/Users
。您现在将它添加到低一级,但它不起作用。
"rules":
"Users":
".indexOn": ["IsNotificationEnabled"]
,
".read": true,
".write": true
我发现通过考虑我在哪里运行查询最容易记住在哪里定义索引。由于您的查询在 /Users
上运行,因此您需要在该级别定义索引。
我还删除了/Users/$uid
上的.read
和.write
规则,因为它们无效。您已经在 root 授予了完全的读/写访问权限,并且不能在较低级别取消权限。
【讨论】:
嘿,我想明白。我将删除对 root 的读写,因为我希望只有具有 uid 的用户可以读写。此外,当我从 firebase 函数读取数据时,我是否需要按照您在答案中显示的内容进行编写?因为 isNotificationEnabled 在我的应用程序中的每个用户 ID 下。用户/random_key/isNotificationEnabled 正如我所说:您需要在运行查询的地方定义索引。由于您查询/Users
,因此您需要将索引添加到/Users
。
请注意,删除根 ".read": true
将确保您的查询失败,因为 rules are not filters。如果您希望能够从/Users
读取,您必须对/Users
具有读取权限。以上是关于Firebase 警告:使用 Firebase Cloud Function 搜索数据时使用未指定的索引的主要内容,如果未能解决你的问题,请参考以下文章
Xcode8/Swift 3 更新后缺少 Firebase 标头警告
FIREBASE 警告:使用未指定的索引。您的数据将在客户端下载和过滤
警告,缺少 FIREBASE_CONFIG 和 GCLOUD_PROJECT 环境变量。初始化 firebase-admin 将失败