在Firestore写入数字类型字段时报util.Long.fromValue is not a function错误如何解决
问题根因
该报错是firebase-admin依赖的protobufjs库与long包版本不兼容导致的:protobufjs在序列化数字类型值到gRPC请求时,会调用long包的Long.fromValue方法,当项目中long包版本过高/缺失时,就会抛出这个错误。所以不管你写入的是Date.now()生成的时间戳还是静态数字123,只要是数字类型都会触发该错误;转成字符串后绕开了数字序列化逻辑,因此可以正常运行。
解决方案
- 方案一:安装兼容版本的long包
运行命令:
注:long 5.x版本修改了模块导出方式,旧版本protobufjs无法识别对应方法,安装4.x版本即可解决问题。npm install long@^4.0.0 - 方案二:清理依赖后重新安装
冗余的依赖缓存也可能导致该问题,按以下步骤操作即可:- 删除项目根目录下的
node_modules文件夹 - 删除
package-lock.json(npm用户)或yarn.lock(yarn用户)文件 - 重新执行
npm install或yarn install
- 删除项目根目录下的
- 方案三:升级Firebase Admin SDK到最新稳定版
运行命令:
新版SDK已经修复了相关依赖兼容性问题。npm install firebase-admin@latest
额外优化建议
Firestore官方推荐使用内置的服务端时间戳来记录文档创建/更新时间,无需手动传入时间戳:
await docRef.set({ postId: v4(), createdAt: admin.firestore.FieldValue.serverTimestamp() });
这种方式生成的时间戳是Firestore标准的Timestamp类型,后续查询、排序的兼容性更好,也不会触发本次的序列化错误。
内容的提问来源于stack exchange,提问作者kyun
相关产品推荐
相关产品推荐

