在我的nodejs
中,我有一个小mongoose
模块exports
model (User)
。当我在不使用destructuring
赋值的情况下需要模块并使用new
运算符创建模型的新实例时,我得到模型不是函数的error
。但是,如果我在destructuring
模型时使用require
赋值,那么一切正常。无法理解为什么。
User.js 导出模型
const mongoose = require('mongoose');
exports.User = mongoose.model('User', {
email:{
type: String,
trim: true,
minlength: 1,
reuqired: true
}
});
如果我不在第2行上使用解构运算符,则代码会抛出错误:
的 server.js
const mongoose = require('../DB/mongoose');
const User = require('../Models/User');
console.log(typeof(User));
let user = new User({
email: "sdfdsf"
});
server.js 会抛出以下错误:
let user = new User({
^
TypeError: User is not a constructor
at Object.<anonymous> (F:\javascript\nodePractice\ToDoApp\server\server.js:6:12)
at Module._compile (internal/modules/cjs/loader.js:678:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:689:10)
at Module.load (internal/modules/cjs/loader.js:589:32)
at tryModuleLoad (internal/modules/cjs/loader.js:528:12)
at Function.Module._load (internal/modules/cjs/loader.js:520:3)
at Function.Module.runMain (internal/modules/cjs/loader.js:719:10)
at startup (internal/bootstrap/node.js:228:19)
at bootstrapNodeJSCore (internal/bootstrap/node.js:576:3)
但是,如果我在
destructuring
上使用line 2
作业,那么一切正常。 server.js :
const mongoose = require('../DB/mongoose');
const {User} = require('../Models/User');
console.log(typeof(User));
let user = new User({
email: "sdfdsf"
});
答案 0 :(得分:4)
const {User} = require('../Models/User');
相当于
const User = require('../Models/User').User;
// ^^^^^
require()
返回的模块对象(模块填充的exports
对象)具有.User
属性。如果您没有访问它但尝试将模块对象用作构造函数,则会抛出它。
要明确,您可能想要使用
const userModule = require('../Models/User');
console.log(typeof userModule);
console.log(typeof userModule.User);
let user = new userModule.User({
email: "sdfdsf"
});
或者,如果你坚持做const User = require('../Models/User');
,你也可以通过覆盖module.exports
而不是在其上创建属性来使构造函数成为导出的对象:
const mongoose = require('mongoose');
module.exports = mongoose.model('User', {
…
});
答案 1 :(得分:1)
您正在导出一个具有名为&#34; User&#34;托管模型的人。导入时,您需要指定要导入的文件的哪个部分,或者稍后需要指定要使用的属性。你仍然可以使用
const User = require('../Models/User');
但您需要致电User.User
,稍后访问exports.User
:
let user = new User.User({ //call exports.User from User model file
email: "sdfdsf"
});