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 将失败

Swift iOS 14 Firebase 警告 - 这个旧式函数定义之前没有原型

输入聊天消息时的Firebase警告[重复]

Firebase 远程配置 isDeveloperModeEnabled() 已弃用