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

Node.js中require未用解构赋值时无法调用Mongoose模型的问题

问题原因及解决办法

这问题我之前也碰到过,核心就是Node.js模块导出和导入的匹配逻辑没对齐,咱们拆解来看:

1. 先看你的模块导出逻辑(User.js)

你是这样导出模型的:

const mongoose = require('mongoose');
exports.User = mongoose.model('User', {
  email:{
    type: String,
    trim: true,
    minlength: 1,
    required: true // 这里你写错成reuqired了,顺便提一嘴😉
  }
});

这种写法的本质是:给模块的exports对象添加了一个User属性,属性值才是mongoose生成的User模型构造函数。也就是说,整个模块对外暴露的是一个{ User: 构造函数 }的对象,而不是直接暴露构造函数本身。

2. 错误导入方式的问题(server.js)

当你用const User = require('../Models/User')时,User变量接收到的是整个导出对象,你可以打印typeof(User)看看,结果会是object,而不是function。对象当然不能用new来实例化,所以才会抛出TypeError: User is not a constructor的错误。

3. 正确解构方式的原理

而const {User} = require('../Models/User')是ES6的解构赋值语法,它的作用就是从导出的对象里,直接提取出User属性的值——也就是那个真正的模型构造函数。这时候typeof(User)会是function,自然能正常用new创建实例。

额外的解决思路

如果你不想用解构赋值,也可以修改User.js的导出方式,直接把模型构造函数作为模块的默认导出:

const mongoose = require('mongoose');
module.exports = mongoose.model('User', {
  email:{
    type: String,
    trim: true,
    minlength: 1,
    required: true
  }
});

这样你在server.js里用const User = require('../Models/User')就能直接拿到构造函数,不用解构也能正常实例化了。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:10:41