Firebase读取custom claims报Object is possibly 'undefined'错误
问题原因
这是TypeScript的静态类型校验报错,不是业务运行时错误。之前代码正常运行数月突然报错,通常是两个原因:
- 你最近调整了TypeScript配置,开启了
strictNullChecks或者全量strict校验规则,之前规则宽松的时候不会拦截这类潜在空值访问 - 你升级了项目依赖的
firebase-admin版本,新版SDK的类型定义明确标记UserRecord.customClaims字段可能为undefined——毕竟确实存在用户从未设置过自定义声明的场景,类型系统会强制要求你处理这种边界情况。
排查步骤
- 先查
tsconfig.json的配置,确认近期有没有调整严格空值检查相关的规则 - 查
package.json里的firebase-admin版本,确认是不是近期做了依赖升级,v10及以上版本的auth模块类型确实调整了customClaims的可选标记 - 可以拉取几个报错关联的用户数据,确认是否存在未设置任何custom claims的用户,这类用户在之前的代码里其实是有运行时报错风险的,只是之前没触发到而已
修复方案
优先推荐空值兜底的写法,同时解决类型校验问题和运行时边界问题:
exports.checkAuthClaim = functions.https.onCall(async (data, context) => { const userId = data.userId; return admin .auth() .getUser(userId) .then((userRecord) => { console.log(userRecord.customClaims); // 无自定义声明时默认用空对象兜底 const claims = userRecord.customClaims ?? {}; return { role: claims["role"], type: claims["type"], }; }); });
如果你100%确定业务里所有用户都已经设置了对应的custom claims,只是想快速跳过类型检查,也可以用TS的非空断言语法:
return { role: userRecord.customClaims!["role"], type: userRecord.customClaims!["type"], };
注意:非空断言仅在编译阶段跳过类型校验,不会做任何运行时兼容,如果存在未设置自定义声明的用户,运行时依然会抛出「无法读取undefined的属性」错误,生产环境不推荐用这种写法。
内容的提问来源于stack exchange,提问作者devOP1
相关产品推荐
相关产品推荐

