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

Express+Mongoose+Swagger开发API遇_id字段及BSON类型错误求助

问题解决方法

1. 移除Swagger Schema中多余的_id字段

使用mongoose-to-swagger转换模型时,通过配置选项直接排除_id字段即可:

  • 在转换代码中添加exclude参数指定忽略字段:
// App.js 中模型转Swagger Schema的代码
const m2s = require('mongoose-to-swagger');
const Buyer = require('./Buyer_model');

const swaggerBuyerSchema = m2s(Buyer, {
  exclude: ['_id'] // 排除父文档自动生成的_id
});

如果子文档(如Buyer_Delivery_Address)也生成了多余_id,配合第二个问题的解决方案(关闭子文档自动生成_id),转换后的Swagger Schema就不会包含子文档的_id字段。

2. 解决Buyer_Delivery_Address._id的BSONTypeError错误

这个错误是因为Mongoose子文档默认会自动生成_id字段,且类型强制为ObjectId,但你提交的"1"并非有效ObjectId格式,触发了校验失败。两种解决路径:

路径一:关闭子文档自动生成_id

如果不需要子文档的_id字段,在子Schema定义时显式关闭自动生成:

// Buyer_model.js 中的子Schema定义
const mongoose = require('mongoose');

const BuyerDeliveryAddressSchema = new mongoose.Schema({
  // 你的地址字段示例
  street: String,
  city: String,
  zipCode: String
}, { _id: false }); // 关键:禁用子文档自动生成_id

// 父Schema定义
const BuyerSchema = new mongoose.Schema({
  name: String,
  email: String,
  deliveryAddress: BuyerDeliveryAddressSchema
});

module.exports = mongoose.model('Buyer', BuyerSchema);

路径二:修改_id字段类型匹配提交数据

如果确实需要子文档的_id,将字段类型改为String以兼容你提交的数值字符串:

const BuyerDeliveryAddressSchema = new mongoose.Schema({
  _id: String, // 手动指定_id类型为String
  street: String,
  city: String,
  zipCode: String
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 09:40:37