【问题标题】:Firebase Database doesn't return error when removing a nonexistent key删除不存在的密钥时,Firebase 数据库不返回错误
【发布时间】:2021-01-07 07:48:27
【问题描述】:

Database 中,我删除了一个实际的密钥-LoGeKWGQMJ2EZ5b_Scp,它工作正常。但后来我尝试再次删除相同的确切密钥并打印成功删除。然后我添加了一个完全伪造的密钥12345,它仍然打印成功删除

guard let userId = Auth.auth().currentUser?.uid else { return }
let fakeKey = "12345"
    
let postsRef = Database.database().reference().child("posts").child(userId).child(fakeKey)
postsRef.removeValue { (error, _) in
    if let error = error {
        print(error.localizedDescription)
        return
    }

    print("successfully deleted") // always prints
}

然后我尝试了原子删除以查看会发生什么,它为 1 个真密钥和 1 个假密钥打印 成功删除。即使在真正的密钥被删除并且我再次尝试之后,它仍然为假密钥和不存在的密钥打印成功删除

guard let userId = Auth.auth().currentUser?.uid else { return }
let fakeKey = "12345"

let postsRef = "/posts/\(userId)/\(fakeKey)"

// this is a real key  
let realKey = "-LvXTCmXfpzJA9SUBX8U"  
let postsUserIdsRef = "/posts_userIds/\(userId)/\(realKey)"

var dict = [String: Any]()
dict.updateValue(NSNull(), forKey: postsRef)
dict.updateValue(NSNull(), forKey: postsUserIdsRef)

let rootRef = Database.database().reference()
rootRef.updateChildValues(dict, withCompletionBlock: { (error, _) in
        
    if let error = error {
        print(error.localizedDescription)
        return
    }
        
    print("successfully deleted") // always prints 
})

奇怪的是,当我尝试对存储做同样的事情时,我总是收到 does not exist 错误,这正是我所期望的

Object myUserId/-MHRkqMuc9c43MDNnbkw/-LoGeKWGQMJ2EZ5b_Scp.mp4 does not exist.

代码:

// for this example postId is a real key but the videoId is the nonexistent key from above
guard let userId = Auth.auth().currentUser?.uid else { return }
let realPostId = "-MHRkqMuc9c43MDNnbkw"
let nonexistentVideoId = "-LoGeKWGQMJ2EZ5b_Scp"

let storageRef = Storage.storage().reference().child(userId).child(realPostId).child("\(nonexistentVideoId).mp4")
storageRef.delete(completion: { (error) in

    if let error = error {
        print(error.localizedDescription) // prints Object myUserId/-MHRkqMuc9c43MDNnbkw/-LoGeKWGQMJ2EZ5b_Scp.mp4 does not exist.
        return
    }

    print("successfully deleted") // never prints
})

顺便说一句,Storage 如果您成功删除了一次并尝试再次删除它,它将返回 does not exist 错误。

为什么Database 不为不存在/以前删除的密钥和/或假密钥返回错误,但Storage 确实返回错误?

【问题讨论】:

    标签: ios swift firebase-realtime-database firebase-storage


    【解决方案1】:

    当操作完成后键不存在时,Firebase 实时数据库认为删除操作成功。当前操作是否实际删除了密钥并不是其成功的一个因素,所以您看到的是预期的行为。

    如果您希望只有在密钥最初存在时才成功的操作,然后您主动删除它,您需要use a transaction


    Cloud Firestore 对不存在的文档的删除操作遵循相同的逻辑,因此 Cloud Storage 似乎是一个奇怪的地方。据我所知,这种差异没有记录在案的原因。

    【讨论】:

    • 我知道如何使用事务来跟踪计数属性,例如 numOfFollowers。您如何将它用于其他类型的属性,例如 eyeColor?
    • 应该差不多,但在这种情况下,您只想检查是否有任何值(然后删除它)。
    • 好的,谢谢,我试试,如果我不能得到它我会再问一个问题
    猜你喜欢
    • 1970-01-01
    • 2013-05-07
    • 2018-06-10
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 2020-08-10
    • 2017-06-22
    • 2017-11-08
    相关资源
    最近更新 更多