Cloud Run使用Datastore报数值越界如何传入wrapNumbers=true配置
问题描述
Datastore中存储了值为7766277975020011920及相近量级的大整数数据,Node.js运行时抛出如下错误:
Error: We attempted to return all of the numeric values, but chain value 7766277975129421920 is out of bounds of 'Number.MAX_SAFE_INTEGER'.
报错提示需要在node_modules/@google-cloud/datastore/build/src/entity.js:412:19处配置options.wrapNumbers=true,但当前服务部署在Google Cloud Run环境,无法直接编辑node_modules内的依赖文件,需通过正确方式传入配置参数解决问题。
解决方法
- 不需要修改node_modules内的源码,在初始化Datastore客户端实例时直接传入配置参数即可。初始化代码参考:
const { Datastore } = require('@google-cloud/datastore'); // 初始化阶段传入wrapNumbers配置 const datastore = new Datastore({ wrapNumbers: true });
- 配置生效后,所有超出JavaScript
Number.MAX_SAFE_INTEGER范围的数值会自动包装为Datastore内置的Int类型对象,不会再触发数值越界报错。读取这类大整数时,调用对象的valueOf()方法即可拿到无精度损失的字符串格式数值,使用示例:
const [result] = await datastore.get(datastore.key(['YourEntityKind', targetId])); // 获取无精度损失的大整数值 const safeBigIntValue = result.chain.valueOf();
- 如果项目内做了Datastore实例的全局封装,只需要找到实例初始化的入口文件,补充上述配置后重新构建部署到Cloud Run即可,不需要改动已有的业务查询逻辑。
内容的提问来源于stack exchange,提问作者Leonar Aung
相关产品推荐
相关产品推荐

