Firestore测试中使用FieldValue.arrayUnion报错问题
解决Firebase v9测试中FieldValue.arrayUnion报错问题
问题原因
你在测试代码中使用的FieldValue大概率来自firebase-admin SDK,但测试环境用的是Firebase v9 JavaScript模块化SDK,两者的FieldValue对象不兼容——v9的Firestore实例无法识别admin SDK的ArrayUnionTransform类型,直接导致报错。
解决方案
1. 导入v9 SDK对应的FieldValue
确保测试代码中导入的是Firebase v9 Firestore模块的FieldValue,而非firebase-admin的版本:
// 正确导入v9的FieldValue import { FieldValue } from "firebase/firestore";
如果之前代码里是从firebase-admin/firestore导入的FieldValue,直接替换成上述语句即可。
2. 验证核心逻辑(可选)
你通过testEnv.unauthenticatedContext().firestore()获取v9 Firestore实例的逻辑是正确的,无需修改。修正FieldValue导入后,重新运行测试,arrayUnion操作就能被v9的Firestore实例正常识别。
修正后的核心代码示例
// 顶部导入正确的FieldValue import { FieldValue } from "firebase/firestore"; beforeAll(async () => { process.env.GCLOUD_PROJECT = "my-project-id"; process.env.FIRESTORE_EMULATOR_HOST = "127.0.0.1:8086"; testEnv = await initializeTestEnvironment({ projectId: projectId, firestore: { rules: readFileSync("firestore.rules", "utf8"), host: "127.0.0.1", port: 8086 } }); const unauth = testEnv.unauthenticatedContext(); db = unauth.firestore(); connectFirestoreEmulator(db, "127.0.0.1", 8086); const washingtonRef = db.collection("cities").doc("DC"); await washingtonRef.set({ regions: [] }); // 现在使用v9的FieldValue,可被正常解析 await washingtonRef.update({ regions: FieldValue.arrayUnion({a: 0}) }); const doc = await washingtonRef.get(); if (!doc.exists) { console.log("No such document!"); } else { console.log("Document data:", doc.data()); } })
内容的提问来源于stack exchange,提问作者m_cht
相关产品推荐
相关产品推荐

