MongoDB Realm返回带类型标识的BJSON如何转换为标准JSON
解决方案
你碰到的是MongoDB扩展JSON(EJSON)的格式特性,Realm默认返回带类型标识的EJSON是为了完整保留MongoDB的字段类型信息,不需要手动实现递归解析,有三种成熟方案可选:
方案1:使用官方bson库解析(最推荐,全类型兼容)
先安装MongoDB官方的BSON处理包:
npm install bson
请求拿到原始返回数据后调用EJSON反序列化即可自动处理所有嵌套结构的类型标识:
import { EJSON } from 'bson'; // 替换为你自己的请求逻辑 const rawData = await fetch(yourRealmWebhookUrl).then(res => res.json()); const parsedData = EJSON.deserialize(rawData);
该方法可以自动适配$numberInt、$numberLong、$date、$objectId等所有MongoDB专属类型标识,无需额外处理嵌套层级。
方案2:用JSON.parse原生钩子实现(无额外依赖)
如果不想引入第三方依赖,可以直接用JSON.parse的reviver参数自定义解析逻辑:
// 先拿到接口返回的原始字符串,不要直接调用res.json() const rawText = await fetch(yourRealmWebhookUrl).then(res => res.text()); const parsedData = JSON.parse(rawText, (key, value) => { // 处理整数类型 if (value && typeof value === 'object' && '$numberInt' in value) { return parseInt(value.$numberInt, 10); } // 可按需扩展其他类型处理逻辑,比如长整型、浮点数 if (value && typeof value === 'object' && '$numberLong' in value) { return parseInt(value.$numberLong, 10); } if (value && typeof value === 'object' && '$numberDouble' in value) { return parseFloat(value.$numberDouble); } return value; });
方案3:Realm Webhook服务端直接返回标准JSON(一劳永逸)
直接修改Webhook的服务端逻辑,返回时用relaxed模式序列化EJSON,前端不需要做任何兼容处理:
// Realm Webhook服务端代码示例 exports = async function(payload, response) { // 替换为你自己的数据库查询逻辑 const queryResult = await context.services.get("mongodb-atlas").db("你的库名").collection("你的集合名").find({}); // 用relaxed模式序列化,自动去掉所有类型标识 response.setBody(EJSON.stringify(queryResult, { relaxed: true })); response.setContentType("application/json"); return; };
内容的提问来源于stack exchange,提问作者jablonka
相关产品推荐
相关产品推荐

