Firestore自动生成ID存储报错求助:DocumentReference.set()参数无效
解决Firestore中自动生成文档ID存入字段的报错问题
嘿,我来帮你搞定这个报错!你遇到的ERROR Error: Function DocumentReference.set() called with invalid data. Unsupported field value: undefined (found in field activityId),本质原因是你要存入的activityId字段值是undefined——说白了就是你还没正确拿到自动生成的文档ID,就急着调用set()方法了。
下面给你两种靠谱的解决方法,推荐第一种一步到位的方式:
方法一:先获取文档ID,再写入数据
这是最高效的方式,先让Firestore生成一个文档ID,再把ID和其他数据一起写入文档:
// 1. 先创建一个带自动生成ID的文档引用(不用传参数给doc()) const docRef = db.collection('你的集合名称').doc(); // 2. 从引用里提取自动生成的ID const activityId = docRef.id; // 3. 把ID和其他数据一起写入文档 docRef.set({ activityId: activityId, // 这里放你的其他字段,比如: activityName: "户外徒步", createTime: new Date() }) .then(() => { console.log("文档写入成功,ID已存入activityId字段!"); }) .catch((error) => { console.error("写入出错:", error); });
原理很简单:调用doc()不传参数时,Firestore会直接生成一个唯一的文档ID,你通过docRef.id就能拿到这个ID,之后把它作为正常字段值传入set()就不会出现undefined的问题了。
方法二:先写入数据,再更新ID(备选方案)
如果你习惯用add()方法写入数据,可以先写基础数据,再通过返回的文档引用获取ID并更新:
db.collection('你的集合名称').add({ // 先写入除了activityId之外的其他数据 activityName: "户外徒步", createTime: new Date() }) .then((docRef) => { // 写入成功后,从返回的引用里拿到文档ID const activityId = docRef.id; // 更新文档,把ID存入activityId字段 return docRef.update({ activityId: activityId }); }) .then(() => { console.log("文档ID已成功补写到字段中!"); }) .catch((error) => { console.error("操作出错:", error); });
这种方式需要两次Firestore操作(写入+更新),所以更推荐方法一,一次操作完成所有需求。
核心要点就是:确保你在调用set()之前,已经拿到了有效的文档ID,避免传入undefined的字段值。
内容的提问来源于stack exchange,提问作者fahad navaid khan
相关产品推荐
相关产品推荐

