我尝试使用FirestoreDataConverter
将对象转换为firestore数据,但似乎转换器仅适用于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;
},
};
预期控制台输出
Went through to-converter
Went through from-converter
Went through to-converter
控制台实际输出
Went through to-converter
Went through from-converter
这种情况特别发生在updateDoc
上。如果我使用setDoc
,它会像预期的那样工作。难道updateDoc
不受支持吗?文档中似乎根本没有提到它。https://firebase.google.com/docs/reference/node/firebase.firestore.FirestoreDataConverter
2条答案
按热度按时间ibrsph3r1#
该转换器旨在帮助转换顶级(
T
)数据结构。在set()
中,您传递给它的数据类型是T
或partial T
,这就是转换器生效的原因。另一方面,
update()
用于更新字段,其中字段可以位于Document中的嵌套数据结构内,并且不需要partial T
。因此它不会触发转换器。z0qdvdin2#
查看您的代码,您使用的是Firestore Web版本9,它具有用于设置和更新数据的新语法。您可以参考here以获得适当的参考。
您遇到的行为正在按预期工作。Web版本9中的
updateDoc()
函数使用新的UpdateData
类型,该类型执行类型检查并支持字段值。