在Firestore中存储用户疫苗接种信息子集合的方式是否正确?
你的实现逻辑基本正确,可以达到为users集合内的指定用户创建vaccination子集合存储疫苗接种信息的效果,但存在3处需要修正和优化的点:
- 异步逻辑处理缺失:Firestore的
set()方法属于异步操作,会返回Promise对象,你当前的写法没有等待异步操作执行完成就打印了保存成功的日志,无法真实反馈数据是否成功写入;同时try/catch只能捕获同步代码的异常,异步操作抛出的报错无法被当前的catch块捕捉,会导致报错丢失。 merge配置冗余:你调用doc()时没有传入指定的文档ID,Firestore会自动为每条接种记录生成随机唯一ID,此时写入的是全新文档,{merge: true}的作用是更新已有文档时仅覆盖传入的字段、保留文档内其他未传字段,在纯新增场景下该配置没有实际作用,若你的业务仅做新增可以直接移除,若后续要兼容更新已有接种记录的逻辑可以保留。- 缺少uid有效性校验:建议在执行写入逻辑前先判断
uid是否为有效值,避免uid未完成初始化时,在users集合下生成ID为undefined的无效文档。
优化后的代码参考:
const handleSubmit = async (e) => { e.preventDefault(); // 先校验uid是否存在 if (!uid) { console.error("用户ID不存在,无法保存数据"); return; } try { const userVaccineRef = firestore .collection("users") .doc(uid) .collection("vaccination") .doc(); // 等待写入操作完成 await userVaccineRef.set({ vaccineType, firstDoseDate, secDoseDate, firstVaccinator, secondVaccinator, }); // 写入成功后再打印,还可以获取到生成的接种记录ID用于后续操作 console.log("数据保存成功,接种记录ID:", userVaccineRef.id); } catch (err) { console.error("保存失败:", err); } };
内容的提问来源于stack exchange,提问作者JS3
相关产品推荐
相关产品推荐

