Angular8+AngularFire管理员创建用户时Firebase重复应用错误排查
解决Firebase重复初始化App的问题
你的问题很典型——你每次调用createUserWithEmailAndPassword方法时都会初始化一个名为Secondary的Firebase App,但Firebase不允许重复创建同名的App实例,这就是第二次调用报错的原因。而且你最后把secondaryApp设为null只是清除了本地变量的引用,并没有真正销毁Firebase端的App实例,所以这个App会一直存在,导致后续调用冲突。
正确的处理方式
我们需要先检查是否已经存在名为Secondary的App,存在的话直接复用;使用完成后,要调用delete()方法真正销毁这个App实例,而不是仅仅置空变量。下面是修改后的代码:
async createUserWithEmailAndPassword(email: string, password: string): Promise<string> { let secondaryApp; // 先尝试获取已存在的Secondary App,不存在则初始化 try { secondaryApp = firebase.app('Secondary'); } catch (error) { secondaryApp = firebase.initializeApp(environment.firebaseConfig, 'Secondary'); } try { // 创建新用户 const userCredential = await secondaryApp.auth().createUserWithEmailAndPassword(email, password); // 登出新创建的用户(避免覆盖管理员会话) await secondaryApp.auth().signOut(); // 销毁Secondary App实例,释放资源并避免后续重复初始化报错 await secondaryApp.delete(); if (userCredential.user.uid) { return userCredential.user.uid; } else { throw new Error('用户UID不存在'); } } catch (error) { // 发生错误时也要确保销毁App实例 if (secondaryApp) { await secondaryApp.delete(); } return Promise.reject(error); } }
关键修改点解释
- 检查已存在的App:通过
firebase.app('Secondary')尝试获取实例,失败则初始化,避免重复创建同名App。 - 真正销毁App实例:调用
secondaryApp.delete()方法让Firebase彻底移除这个App实例,而不是仅仅清除本地变量引用。 - 错误处理中的清理:在catch块中也添加App销毁逻辑,避免异常情况下残留App实例导致后续调用出错。
这样修改后,你就可以在保持管理员登录状态的前提下,多次调用该方法创建新用户,不会再遇到重复App的错误了。
内容的提问来源于stack exchange,提问作者RRGT19
相关产品推荐
相关产品推荐

