Express post /buy接口调用mongoose save方法返回[Function: Error Ctor]错误
问题成因
- 最常见原因:
PositionModel对应的Schema定义时字段类型配置错误,你可能错误地直接调用了类型构造函数(比如写type: String()而不是type: String),把构造函数调用的返回值当成了类型配置,导致Mongoose在校验字段、执行保存逻辑时抛出了未实例化的错误构造函数。 - 次要原因:你为
PositionModel注册的pre('save')前置钩子中,错误地返回/抛出了错误构造函数本身,而不是new Error(错误信息)的实例。 - 小概率排查点:你引入的
PositionModel不是正确导出的Mongoose模型实例,而是导出了错误构造相关的函数。
排查解决步骤
- 优先检查
PositionModel对应的Schema定义,所有字段的type配置必须是构造函数本身,不要加括号调用:
// 错误写法示例 const positionSchema = new mongoose.Schema({ stock: { type: String() }, // 加了括号调用String构造函数,错误 purchasePrice: { type: Number() }, // 同样错误 }) // 正确写法所有type都去掉构造函数的调用括号 const positionSchema = new mongoose.Schema({ stock: { type: String }, ticker: { type: String }, purchasePrice: { type: Number }, shares: { type: Number }, owner: { type: mongoose.Schema.Types.ObjectId, ref: 'User' } })
- 检查是否为
PositionModel注册了pre save钩子,如果有,确认钩子中的错误抛出逻辑是抛出错误实例,不是构造函数本身:
// 错误写法 positionSchema.pre('save', function(next) { if (someCheckFail) return next(Error) // 直接传Error构造函数,错误 }) // 正确写法 positionSchema.pre('save', function(next) { if (someCheckFail) return next(new Error('字段校验失败')) // 抛出错误实例 })
- 检查
PositionModel的导出导入逻辑,确认导出的是mongoose.model返回的模型实例:
// 正确导出逻辑 module.exports = mongoose.model('Position', positionSchema) // 导入时确认路径拼写正确,没有导入错文件 const PositionModel = require('./你的模型文件路径')
- 可临时在catch块新增堆栈打印,更快定位错误位置:
catch (error) { console.log(error) console.log(error.stack) // 新增这行打印调用栈 next(error) }
内容的提问来源于stack exchange,提问作者mycodegoesKABOOM
相关产品推荐
相关产品推荐

