NodeJS集成Firestore出现Cannot read properties of undefined (reading 'where')错误求助
解决Firestore查询中"Cannot read properties of undefined (reading 'where')"错误
错误原因分析
这个错误的核心是this.tournamentParticipationRef为undefined,导致调用.where()方法时触发了属性读取错误,主要有两个关键诱因:
1. setProperties方法未被执行
你的类里,tournamentParticipationRef是在setProperties方法中赋值的,但现有代码里没有任何地方调用这个方法。当你调用checkIfTournamentHasReachedParticipationNumber时,this.tournamentParticipationRef还未被初始化,自然是undefined。
2. database变量的作用域/导入问题
你在index.js中声明了database变量,但如果类所在文件没有正确获取到这个变量,setProperties里的database会是undefined——哪怕调用了setProperties,也无法创建有效的集合引用。
解决方法
针对上述问题,我们一步步修复:
第一步:确保setProperties自动执行
最稳妥的方式是在类的构造函数中调用setProperties,这样每次实例化类时都会自动初始化集合引用:
class TournamentParticipationDataAccessService { constructor() { // 实例化时立即初始化属性 this.setProperties(); } setProperties() { this.tournamentParticipationRef = database.collection('/tournamentParticipation'); } // ... 其他方法 }
第二步:正确共享database变量
不要依赖全局变量传递database,而是通过模块化导出/导入的方式,确保类能获取到有效的Firestore实例:
修改index.js,导出database:
const firebase = require('firebase'); const firebaseAdmin = require('firebase-admin'); // 务必先完成Firebase初始化(这一步很容易漏掉!) const firebaseConfig = { // 填入你的Firebase项目配置信息 }; firebase.initializeApp(firebaseConfig); // 创建并导出Firestore实例 const database = firebase.firestore(); module.exports = { database };
在类所在文件导入database:
// 根据你的文件结构调整导入路径 const { database } = require('./index.js'); class TournamentParticipationDataAccessService { constructor() { this.setProperties(); } setProperties() { this.tournamentParticipationRef = database.collection('/tournamentParticipation'); } checkIfTournamentHasReachedParticipationNumber(tournamentObject) { this.tournamentParticipationRef .where("tournamentId", "==", tournamentObject.objectID) .where("round", "==", tournamentObject.currentRound) .get() .then((querySnapshot) => { // 在这里编写你的业务逻辑 console.log(`查询到 ${querySnapshot.size} 条参与记录`); }) .catch((err) => { // 不要忘记处理异步查询错误 console.error("查询失败:", err); }); } }
额外检查点
- 确认
index.js中的Firebase初始化代码(firebase.initializeApp)已正确执行,缺少这一步的话,firebase.firestore()会返回无效实例。 - 如果你使用Firebase Admin SDK,初始化方式会略有不同,但核心逻辑一致:确保Admin SDK初始化完成后,再导出Firestore实例。
内容的提问来源于stack exchange,提问作者Melodias
相关产品推荐
相关产品推荐

