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
相关产品推荐
相关产品推荐

