Firebase模拟器中admin.firestore.FieldValue为undefined如何解决
问题根因
firebase-admin v11 调整了ES模块的导出规则,Firestore 相关静态属性(包括FieldValue)的挂载逻辑和v9及更早版本不兼容。你当前使用的firebase-tools@11.2.0版本的本地模拟器存在模块加载兼容bug,无法正确解析v11版本admin SDK的导出属性,才会出现模拟器环境返回undefined、正式部署后运行正常的现象——正式部署的Cloud Functions运行时不依赖本地模拟器的模块加载逻辑,因此不受该bug影响。
修复步骤
- 升级firebase-tools到兼容版本
本地functions目录下安装的firebase-tools、全局环境安装的firebase-tools都需要升级到11.15.0及以上版本,执行对应命令:# 升级项目内依赖版本 npm uninstall firebase-tools npm install -D firebase-tools@latest # 如果你是全局安装firebase-tools执行命令,同步升级全局版本 npm install -g firebase-tools@latest - 调整代码导入方式
不要从admin实例对象上读取FieldValue属性,改用firebase-admin v11官方推荐的子路径导入方式,从根源规避模块导出差异问题,修改后的业务代码如下:import * as admin from 'firebase-admin'; import { FieldValue } from 'firebase-admin/firestore'; // 移除用户权限 await firestore.doc(`/${projectsPath}/${projectKey}`).update({ roUids: FieldValue.arrayRemove(uidOfUserToDelete), rwUids: FieldValue.arrayRemove(uidOfUserToDelete), });该写法同时兼容本地模拟器、本地调试、正式部署三类运行环境,不会再出现静态属性找不到的问题。
- 清理缓存后重启模拟器
旧的构建缓存、模拟器缓存会导致修改不生效,依次执行以下命令清理后重启:# 删除旧的TS编译产物 rm -rf lib # 清空模拟器持久化缓存 rm -rf .firebase/emulators # 重新编译TS代码 npm run build # 启动模拟器 firebase emulators:start - 校验TS配置
打开项目下的tsconfig.json,确认compilerOptions中的moduleResolution字段值为node16,和你指定的Node.js 16运行时的模块解析规则匹配,避免编译阶段出现模块加载异常。
内容的提问来源于stack exchange,提问作者Jørgen Rasmussen
相关产品推荐
相关产品推荐

