firebase 如何使用带有更新的FirestoreDataConverter?

siv3szwd  于 2023-03-24  发布在  其他
关注(0)|答案(2)|浏览(99)

我尝试使用FirestoreDataConverter将对象转换为firestore数据,但似乎转换器仅适用于addDocsetDoc操作,但当尝试将其与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

ibrsph3r

ibrsph3r1#

该转换器旨在帮助转换顶级(T)数据结构。在set()中,您传递给它的数据类型是Tpartial T,这就是转换器生效的原因。
另一方面,update()用于更新字段,其中字段可以位于Document中的嵌套数据结构内,并且不需要partial T。因此它不会触发转换器。

z0qdvdin

z0qdvdin2#

查看您的代码,您使用的是Firestore Web版本9,它具有用于设置和更新数据的新语法。您可以参考here以获得适当的参考。
您遇到的行为正在按预期工作。Web版本9中的updateDoc()函数使用新的UpdateData类型,该类型执行类型检查并支持字段值。

相关问题