使用Async Await从Firebase Firestore获取单条记录时出现Cannot read property 'data' of undefined错误的排查求助
Async/Await读取Firebase Firestore文档时出现「Cannot read property 'data' of undefined」错误
我尝试通过文档ID从Firebase Firestore中读取文档,不想使用官方文档里的
.then()语法,想用Async Await实现,但运行时出现了Cannot read property 'data' of undefined的错误。以下是我的代码:export const getOneJobById = async jobId => { try { const snapShot = await db.collection('jobs').doc(jobId).get(); return snapShot.doc.data(); } catch (error) { console.log(error.message); } };请帮我分析问题出在哪里。
问题根源
你这里的核心错误是对Firestore文档快照的结构理解有误:
- 当你调用
db.collection('jobs').doc(jobId).get()时,返回的snapShot直接就是单个文档的快照对象,它本身就拥有data()方法,不需要再通过.doc去访问。 - 你写的
snapShot.doc是不存在的属性,所以它的值是undefined,当你试图调用undefined.data()时,就会抛出你看到的错误。
修正后的代码
把代码里的snapShot.doc.data()改成snapShot.data()即可,另外建议加上文档存在性检查,避免文档不存在时返回undefined引发后续问题:
export const getOneJobById = async jobId => { try { const snapShot = await db.collection('jobs').doc(jobId).get(); // 先检查文档是否存在 if (!snapShot.exists) { console.log(`ID为${jobId}的职位文档不存在`); return null; } return snapShot.data(); } catch (error) { console.log('读取文档失败:', error.message); throw error; // 可选:把错误抛出,让调用方可以处理 } };
补充说明
- 如果是读取集合的多个文档(比如
db.collection('jobs').get()),返回的才是集合快照,这时候需要通过snapShot.docs获取文档快照数组,再逐个调用data()。 - 加上
throw error是为了让调用这个函数的地方能捕获到错误,而不仅仅是在当前函数里打印日志,这样更符合异步代码的错误处理逻辑。
内容的提问来源于stack exchange,提问作者Dijiflex
相关产品推荐
相关产品推荐

