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

