![](/img/trans.png)
[英]Nextjs getStaticPaths not fetching data from firebase firestore
[英]Firebase Firestore fetching data with an ID reference then fetching the reference
在为这个问题的答案搜索了几个小时之后,我在这里找到了 1 篇类似的帖子:但是我试图复制,但我相信语言语法的差异使得它很难翻译。
在我的应用程序中,允许用户发帖,Firsestore 中的帖子结构如下所示:
creator
是也存在于数据库中的用户的 userId。
当我的结构符合 Codable 并且它们 map 1 到 1 时,我知道如何从 Firestore 中获取内容,但我没有经历过在初始获取后必须获取嵌套数据的情况。
问题通过向我的后端查询帖子,我怎样才能同时创建住在里面的用户 object?
这是我期望创建的帖子 object:
import FirebaseFirestoreSwift
public struct Post: Codable {
/// The school id
@DocumentID var id: String?
/// The name of the school
public let content: String
/// The user who made the post
public var creator: AppUser?
}
我想从返回的creator
字段创建appUser
。 我应该构建内容然后使用某种promise.then
来获取用户吗? 或者我可以同时做这两件事吗?
这是我认为我应该做的
public func fetch(for schoolId: String) -> Promise<[Post]> {
return Promise { resolver in
fireStore
.collection("schools").document(schoolId)
.collection("posts").getDocuments { (querySnapshot, err) in
guard let documents = querySnapshot?.documents else {
resolver.reject(Errors.firebaseError)
return
}
let posts = documents.compactMap { queryDocumentSnapshot -> Post? in
return try? queryDocumentSnapshot.data(as: Post.self)
}
let postsWithUser: [Post] = posts.map { post in
//Fetch User and return an updated struct
}
resolver.fulfill(postsWithUser)
}
}
}
我解决了,基本上。 我们想让第一次获取完成。 然后我们遍历每个 post.id 并调用FetchUser()
i 这是我构建的返回Promise<User>
的 function
func fetchTopLevelPost(for schoolId: String) -> Promise<[Post]> {
return Promise { resolver in
fireStore
.collection("schools").document(schoolId)
.collection("posts").getDocuments { (querySnapshot, err) in
guard let documents = querySnapshot?.documents else {
resolver.reject(Errors.firebaseError)
return
}
let posts = documents.compactMap { queryDocumentSnapshot -> Post? in
return try? queryDocumentSnapshot.data(as: Post.self)
}
resolver.fulfill(posts)
}
}
}
func fetchPostUser(for posts: [Post]) -> Promise<[Post]> {
let allPromise = posts.map{ FetchUser().fetch(for: $0.creatorId) }
return Promise { resolver in
when(fulfilled: allPromise).done { users in
let completePost = zip(users, posts).map(post.init(completeData:))
resolver.fulfill(completePost)
}
.catch { error in
resolver.reject(Errors.firebaseError)
}
}
}
这是呼叫站点:
public func fetch(for schoolId: String) -> Promise<[Post]> {
return fetchTopLevelPost(for: schoolId)
.then { self.fetchPostUser(for: $0) }
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.