前端把订单对象整体 stringify 后发现提交没反应,控制台一行 TypeError: Do not know how to serialize a BigInt。订单 id 是后端按 64 位整型下发的。第一次遇到会往复杂处想,其实漏掉的多是个小前提。

node -e "try{JSON.stringify({id:9007199254740993n})}catch(e){console.log(e.message)}"
node -e "console.log(JSON.stringify({id:9007199254740993n},(k,v)=>typeof v==='bigint'?v.toString():v))"

JSON 规范里没有大整数类型,BigInt 不能隐式转成 Number,序列化时只能抛错。异常在事件回调里被吞掉,页面看起来就是点了没反应。这一点先确认清楚,后面就不用反复试。

「BigInt 序列化」这类改动最怕改一半,回滚脚本先准备好,再动生产。新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。

备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。

具体做法是,提交前把 BigInt 转成字符串 保留原值不丢精度;需要数值的地方换支持大整数的解析器;后端对 id 统一按字符串下发 前端不再转 Number;给全局 unhandledrejection 加日志 别让异常静默。

改完照着核一遍,请求体里的 id 是 19 位字符串 和数据库里的原始主键逐位一致。

作者 9823189