【问题标题】:Checking Firebase database for a key without downloading parent node?在不下载父节点的情况下检查 Firebase 数据库的密钥?
【发布时间】:2021-11-08 10:44:14
【问题描述】:

我有一个结构如下的 Firebase 实时数据库:

referrals
 Test1: 0
 Test2: 0

我正在尝试检查数据库中是否存在“referral_code”,这是我正在使用的代码:

exports.validateReferral = functions.https.onCall((data, context) => {
    const referral_code = data.ref
    console.log("Cloud verifying referral code, code is " + referral_code)
    admin.database().ref().child("referrals").once("value", snapshot => {
        if (snapshot.hasChild(referral_code)) {
            console.log("referral code is valid");
            return true
        } else {
            console.log("referral code is not valid");
            return false
        }
    })
})

当我运行它时,它显示“云验证推荐代码,代码是 Test1”但它也返回无效,尽管密钥在数据库中。

知道如何调试吗?我尝试记录“快照”的值,但 Firebase 快照的内容都没有显示实际值。谁能帮我找出问题所在?

【问题讨论】:

    标签: javascript firebase firebase-realtime-database


    【解决方案1】:

    您的代码顶层缺少return

    // ?
    return admin.database().ref().child("referrals").once("value").then((snapshot) => {
        if (snapshot.hasChild(referral_code)) {
            console.log("referral code is valid");
            return true
        } else {
            console.log("referral code is not valid");
            return false
        }
    })
    

    如果没有顶级返回,来自异步回调的返回值永远不会到达您的客户端,并且(更糟糕的是)代码可能会在从数据库读取结果之前终止。


    但我还建议更改代码以不下载整个 referrals 节点,以检查是否存在一个密钥。这完成了相同的操作,并且只下载(最多)一个子节点:

    // ?                                                ?
    return admin.database().ref().child("referrals").child(referral_code).once("value").then((snapshot) => {
        //   ? 
        if (snapshot.exists()) {
            console.log("referral code is valid");
            return true
        } else {
            console.log("referral code is not valid");
            return false
        }
    })
    

    【讨论】:

    • 非常感谢弗兰克。但是您知道为什么我现在会收到“未处理的错误 RangeError:超出最大调用堆栈大小”吗?
    • 在这里混合 Promise 和 Callback API 不会将布尔值返回给调用者。
    • 很好地抓住了山姆。 ? 我忽略了这使用了经典的回调。我现在修好了,但如果我错过了其他东西,请告诉我。 @TheNomadicAspie 您可能想再试一次,尽管我不确定堆栈溢出是否是由混合的承诺/回调处理引起的。
    • @FrankvanPuffelen 在重新部署函数并重新启动模拟器之前重新启动我的计算机以某种方式修复了堆栈溢出,我现在唯一遇到的问题是,尽管“Test1”是我的 Firebase 数据库中的一个键,并且尽管代码在控制台语句中显示“Test1”,但它始终返回 false。
    • 函数:开始执行“us-central1-validateReferral”> {“verifications”:{“app”:“MISSING”,“auth”:“MISSING”},”logging.googleapis.com /labels":{"firebase-log-type":"callable-request-verification"},"severity":"INFO","message":"Callable request 验证通过"} > 云验证引用代码,代码为 Test1 > 推荐代码无效 i 函数:在 ~1s 内完成“us-central1-validateReferral”
    猜你喜欢
    • 2018-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-08
    相关资源
    最近更新 更多