为什么 Firestore 认为它检索了一个不存在的文档?
Why does Firestore think it retrieved a document when one doesn't exist?
我正在使用 swift(UI) 与 firebase 和 Google 登录。到目前为止,登录一直很好,但是当我开始使用新用户时,下面的代码失败了——没有致命错误,只是没有向 Firestore 添加新的用户文档,因为它似乎认为它已经检索到一个它无法检索到的文档因为具有指定 ID 的不存在。
我猜错误在以下部分:
if let error = error as NSError? {
print("Error getting document: \(error.localizedDescription)")
self.setFirestoreUser()
}
完整功能:
func fetchUser(documentId: String) {
let docRef = Firestore.firestore().collection("users").document(documentId)
print("User id: \(documentId) ( via fetchUser )")
docRef.getDocument { document, error in
if let error = error as NSError? {
print("Error getting document: \(error.localizedDescription)")
self.setFirestoreUser()
}
else {
if let document = document {
do {
print("Working on coding to User.self")
self.appUser = try document.data(as: User.self)
self.fetchSites()
}
catch {
print("func - fetchUser() error: \(error)")
}
}
}
}
}
参数 'documentId' 是从 google 签名过程
传递过来的
为这个新用户创建新的 Firestore 文档的后续函数:
func setFirestoreUser() {
let googleUser = GIDSignIn.sharedInstance.currentUser
let db = Firestore.firestore()
self.appUser.emailAddress = googleUser?.profile?.email ?? "Unknown"
self.appUser.userGivenName = googleUser?.profile?.givenName ?? ""
self.appUser.userFirstName = googleUser?.profile?.name ?? ""
self.appUser.userProfileURL = googleUser?.profile!.imageURL(withDimension: 100)!.absoluteString ?? ""
do {
try db.collection("users").document(googleUser?.userID ?? "UnknownID").setData(from: self.appUser)
self.fetchUser(documentId: googleUser?.userID ?? "")
} catch {
print(error)
}
}
在对 non-existing 文档的引用上调用 getDocument
不是错误(据我所知),并且会 return 成为 DocumentSnapshot
。要检测文档是否存在,请检查快照上的 exists
property 而不是(仅)检查错误。
if let document = document {
if !document.exists {
...
我正在使用 swift(UI) 与 firebase 和 Google 登录。到目前为止,登录一直很好,但是当我开始使用新用户时,下面的代码失败了——没有致命错误,只是没有向 Firestore 添加新的用户文档,因为它似乎认为它已经检索到一个它无法检索到的文档因为具有指定 ID 的不存在。 我猜错误在以下部分:
if let error = error as NSError? {
print("Error getting document: \(error.localizedDescription)")
self.setFirestoreUser()
}
完整功能:
func fetchUser(documentId: String) {
let docRef = Firestore.firestore().collection("users").document(documentId)
print("User id: \(documentId) ( via fetchUser )")
docRef.getDocument { document, error in
if let error = error as NSError? {
print("Error getting document: \(error.localizedDescription)")
self.setFirestoreUser()
}
else {
if let document = document {
do {
print("Working on coding to User.self")
self.appUser = try document.data(as: User.self)
self.fetchSites()
}
catch {
print("func - fetchUser() error: \(error)")
}
}
}
}
}
参数 'documentId' 是从 google 签名过程
传递过来的为这个新用户创建新的 Firestore 文档的后续函数:
func setFirestoreUser() {
let googleUser = GIDSignIn.sharedInstance.currentUser
let db = Firestore.firestore()
self.appUser.emailAddress = googleUser?.profile?.email ?? "Unknown"
self.appUser.userGivenName = googleUser?.profile?.givenName ?? ""
self.appUser.userFirstName = googleUser?.profile?.name ?? ""
self.appUser.userProfileURL = googleUser?.profile!.imageURL(withDimension: 100)!.absoluteString ?? ""
do {
try db.collection("users").document(googleUser?.userID ?? "UnknownID").setData(from: self.appUser)
self.fetchUser(documentId: googleUser?.userID ?? "")
} catch {
print(error)
}
}
在对 non-existing 文档的引用上调用 getDocument
不是错误(据我所知),并且会 return 成为 DocumentSnapshot
。要检测文档是否存在,请检查快照上的 exists
property 而不是(仅)检查错误。
if let document = document {
if !document.exists {
...