Firebase线上RTDB报错this.getPriority(...).isEmpty is not a function问题咨询
故障根因
该报错由两个原因共同触发:
- 你使用的
firebase-admin@^9.2.0版本存在和Firebase Realtime Database(RTDB)云端最新返回结构不兼容的已知bug:谷歌近期更新了RTDB服务端的返回字段规则,旧版SDK调用getPriority()后返回的对象不再内置isEmpty方法,触发调用异常。 - 你的代码存在冗余
await写法:admin.database().ref()是同步方法,不需要加await,多余的await会导致引用对象的原型链方法丢失,放大了SDK的兼容问题。
本地环境正常是因为你使用的RTDB模拟器仍为旧版本返回结构,和线上服务端逻辑不一致,所以会出现本地正常、线上突然报错的情况。
修复方案
- 第一步:升级
firebase-admin依赖到兼容版本,同时固定版本号避免意外升级
将package.json中firebase-admin的版本改为"firebase-admin": "^11.11.1"(优先选11.x LTS版本,也可以选9.x系列最新修复版9.12.0),删除node_modules和package-lock.json/yarn.lock后重新安装依赖即可。 - 第二步:修正代码中的冗余
await,修改后的函数代码如下:
export const RTDBMeters: (id: string, p: string) => Promise<number> = async (id, p) => { // 去掉ref前多余的await const treesRef = admin.database().ref(`/${p}/stats/${id}`); if (treesRef) { return await treesRef.once("value").then(i => { if (i.exists()) { return i.val() + 0; } else { log({'stats value does not exist': id}) return 0; } }); } else { log({'stats value location does not exist': id}) return 0; } }
- 第三步:重新编译部署Cloud Functions,线上调用验证即可恢复正常。
内容的提问来源于stack exchange,提问作者MittenMits
相关产品推荐
相关产品推荐

