tax*_*ree 8 firebase typescript google-cloud-firestore
我正在尝试使用FirestoreDataConverter来转换对象来存储数据,但转换器似乎仅适用于 和addDoc操作setDoc,但是当尝试将其与updateDoc操作一起使用时,它不会触发该toFirestore函数。
可重现的例子
interface Post {
author: string;
content: string;
}
async function addAndUpdatePost() {
const colRef = collection(firestore, 'posts')
.withConverter(postConverter);
const post: Post = { author: 'Author', content: 'Content'};
const docRef = doc(colRef);
await setDoc(docRef, post); // Triggers toFirestore function
const addedPost = (await getDoc(docRef)).data(); // Triggers fromFirestore function
if (!addedPost) return;
await updateDoc(docRef, addedPost) // Does NOT trigger toFirestore function
}
const postConverter: FirestoreDataConverter<Post> = {
toFirestore(post: Post): DocumentData {
console.log("Went through to-converter");
return { ...post};
},
fromFirestore(docSnap: QueryDocumentSnapshot): Post {
console.log("Went through from-converter")
return docSnap.data() as Post;
},
};
Run Code Online (Sandbox Code Playgroud)
预期的控制台输出
Went through to-converter
Went through from-converter
Went through to-converter
Run Code Online (Sandbox Code Playgroud)
实际控制台输出
Went through to-converter
Went through from-converter
Run Code Online (Sandbox Code Playgroud)
这种情况特别发生在updateDoc. 如果我使用setDoc它,它会按预期工作。是updateDoc根本不支持吗?文档中似乎根本没有提到它。
https://firebase.google.com/docs/reference/node/firebase.firestore.FirestoreDataConverter
小智 2
该转换器旨在帮助转换顶层 ( T) 数据结构。在 中set(),您传递给它的数据类型是 或T,partial T这就是转换器生效的原因。
另一方面,update()用于更新字段,其中字段可以位于 Document 中的嵌套数据结构内,并且不是必需的partial T。所以它不会触发转换器。
| 归档时间: |
|
| 查看次数: |
4243 次 |
| 最近记录: |