You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

supertest测试express MongoDB接口时ObjectId被识别为字符串如何解决

问题根源

supertest 调用 send() 方法发送 JSON 格式请求时,会自动对传入的 JS 对象执行 JSON.stringify() 序列化操作:

  • JSON 标准本身不支持 ObjectId、Date 这类自定义类型的实例,序列化时会自动调用对应实例的 toString() 方法转换为字符串
  • 后端收到请求后,express 的 json 解析中间件只会把序列化后的字符串解析为普通字符串,不会自动还原为 ObjectId 或 Date 实例

你业务代码中直接使用同结构对象可以正常识别,是因为对象在 Node.js 运行时中直接传递,没有经过 JSON 序列化+反序列化 的流程,ObjectId 实例的类型被完整保留。

解决方案

可根据测试需求选择对应处理方式:

  • 如果是做接口功能测试(模拟真实客户端请求):
    正常客户端本来就无法发送 ObjectId 实例,只会传输 24 位的 _id 字符串。你只需要在接口逻辑中补充类型转换即可:收到 req.body._id 后主动调用 new ObjectId(req.body._id) 转换类型;如果使用 mongoose 操作 MongoDB,只要 schema 中定义 _id 为 ObjectId 类型,mongoose 会自动完成字符串到 ObjectId 的转换。
  • 如果是做业务逻辑单元测试(不需要走 HTTP 层):
    不需要通过 supertest 发送请求,直接把构造好的带 ObjectId 实例的 testTask 对象作为参数传入路由处理函数测试即可,跳过序列化流程就能保留原始类型。

内容的提问来源于stack exchange,提问作者Dora

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 18:27:04