Firebase本地模拟环境下调用DataConnect查询时触发"Firebase: No Firebase App '[DEFAULT]' has been created"错误求助
看起来你遇到的问题确实有点反直觉——明明Auth已经正常工作说明App初始化成功了,但DataConnect的查询函数却找不到默认App。别担心,我们一步步来排查解决:
1. 优先检查DataConnect与Firebase App的绑定关系
你当前初始化DataConnect的时候只传了connectorConfig,但没有把已经创建好的fbApp实例关联进去。根据Firebase DataConnect的运行规则,getDataConnect的第二个参数需要指定绑定的Firebase App,这样所有基于这个DataConnect实例的操作才会使用正确的App上下文。
修改你的初始化代码:
// 把fbApp作为第二个参数传入getDataConnect dConnect = getDataConnect(connectorConfig, fbApp);
这样DataConnect就会和你已初始化的App强绑定,查询函数就能正确识别到App实例了。
2. 验证Firebase核心包与DataConnect SDK的版本一致性
如果项目中firebase核心包的版本和@firebasegen/default-connector内部依赖的Firebase版本不一致,会出现模块隔离问题——两个独立的Firebase实例无法共享App上下文,就会导致“找不到App”的错误。
解决方法:
- 执行
npm ls firebase查看项目的依赖树,确认所有Firebase相关依赖的版本是否统一; - 如果版本不一致,统一升级/降级到相同版本,然后删除
node_modules和package-lock.json,重新执行npm install。
3. 加固调用时机的校验逻辑
虽然你已经用了fbInitialized标志,但可以再加一层防护,确保调用查询函数时默认App确实存在:
window.GetStudentByemail = async function(_email) { if (!fbInitialized || !dConnect) { throw new Error('Firebase/DataConnect not initialized'); } // 新增:确认默认App可正常获取 const defaultApp = getApp(); if (!defaultApp) throw new Error('Default Firebase App not found'); console.log('GetStudentByemail function activated with ', _email); try { const query = getStudentByemail({ email: _email }); console.log('Query:', query); const qryRef = await executeQuery(dConnect, query); return new Promise((resolve, reject) => { qryRef.onSnapshot( snapshot => resolve(snapshot.data()), error => reject(error) ); }); } catch (error) { console.error('GetStudentByemail error:', error); throw error; } };
这一步能帮你彻底排除“调用时机早于App初始化”的可能性。
4. 确认模拟器连接的顺序
你的代码里先初始化DataConnect再连接模拟器的顺序是对的,但可以调整标记初始化完成的时机,确保模拟器连接后再允许查询调用:
console.log('Initializing DataConnect...'); dConnect = getDataConnect(connectorConfig, fbApp); if (!dConnect) throw new Error('dataConnect not initialized'); connectDataConnectEmulator(dConnect, 'localhost', 9399); // 先确认模拟器连接成功,再标记初始化完成 dConnect.setInitialized(); fbInitialized = true;
总结
先从第一个方案(给getDataConnect传fbApp)开始尝试,这是最常见的触发该错误的原因。你提到在VSCode的DataConnect终端能正常调用查询,说明查询本身是正确的,问题大概率出在前端代码的上下文绑定上。
备注:内容来源于stack exchange,提问作者SJ_3289

