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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 04:39:42