Firebase Admin SDK调用时内层catch未触发、异常被外层捕获问题
你的代码写法存在问题,核心原因有两个:
- 直接修改传入的
user对象添加uid属性,如果原user对象是不可扩展/冻结的,user.uid = record.uid这行同步代码会直接抛出错误,该错误属于createUser的then回调内的同步异常,会直接被外层catch捕获,根本不会执行到后续的set逻辑,你误以为是set操作失败触发的外层catch,实际是赋值操作先出错了。 - 嵌套Promise没有返回,导致Promise链上下文断裂,即使
set操作真的抛出异步错误,也容易出现捕获逻辑不符合预期的问题。
修复方案
更推荐用async/await改写,完全避免嵌套then的逻辑混乱问题,写法更清晰,错误捕获逻辑更可控:
async function addUser(user) { try { // 创建Firebase Auth用户 const userRecord = await admin.auth().createUser(user); // 写入自定义用户集合,不修改原user对象 await userCollection.doc(userRecord.uid).set({ ...user, uid: userRecord.uid }); } catch (error) { // Auth创建失败、集合写入失败都会统一走到这里抛出 throw error; } }
如果要保留原有的then写法,需要做两处修改:
- 不要修改原
user对象,把uid直接放到set的参数中 - 把内层
set返回的Promise return到外层then链,保证错误冒泡路径符合预期
修改后的then写法示例:
admin.auth().createUser(user) .then((record) => { // 返回内层set的Promise,接入外层Promise链 return userCollection.doc(record.uid).set({ ...user, uid: record.uid }); }) .then(() => { resolve(); }) .catch((err) => { // 所有错误统一在这里处理即可,不需要嵌套catch reject(err); });
内容的提问来源于stack exchange,提问作者Ernesto Schiavo
相关产品推荐
相关产品推荐

