Mongoose发起POST请求报错User is not a constructor排查
错误触发原因
抛出User is not a constructor的核心原因是模块导入导出不匹配,代码里还附带2个隐藏bug:
- 你在
user.js中是将mongoose模型作为us属性包裹在普通对象中导出(module.exports = {us}),但在server.js中导入时直接将整个导出对象赋值给User变量。此时User是一个普通JS对象,不是mongoose返回的模型构造函数,无法通过new关键字调用,直接触发构造函数报错。 - save回调的错误变量名不匹配:回调入参写的是
err,内部打印时写的是error,即使解决构造函数问题,触发保存错误时也会抛出error is not defined的新异常。 - 集合配置位置错误:mongoose的集合名配置需要在定义Schema或创建model时传入,你在
new模型实例时传入{ collection: 'Users' }是无效参数,不会生效。
修复方案
1. 修正模型文件(user.js)
推荐直接导出模型构造函数,不需要额外包裹对象,同时修正模型名、把集合配置放到正确位置:
const mongoose = require('mongoose') const userSchema = mongoose.Schema({ name: {type: String, required: true}, password: {type: String, required: true} }, { collection: 'Users' }); // 如果要指定集合名,配置写在Schema第二个参数位 // 模型名建议和业务实体对应,mongoose默认会把模型名转小写复数映射集合 const User = mongoose.model('User', userSchema); // 直接导出构造函数,不要包一层对象 module.exports = User;
如果你坚持要保留原来对象包裹导出的写法,那导入时必须使用解构赋值:
// 对应原module.exports = {us}的导出写法 const { us: User } = require('./models/user');
2. 修正接口逻辑(server.js)
去掉实例化时传入的无效collection参数,修正错误变量名,补全错误响应:
app.post('/save', function(req, res) { console.log(req.body) const newUser = new User({ name: req.body.name, password: req.body.password }); newUser.save(function(err, data){ if(err){ console.log(err); // 修正变量名,和入参err保持一致 res.status(500).send("Data insert failed"); return; } res.send("Data inserted"); }); });
改完之后重启服务,再发起POST请求就不会报构造函数错误了。
内容的提问来源于stack exchange,提问作者anni_m
相关产品推荐
相关产品推荐

