因此,这似乎是一个非常普遍的错误。在看到所有前面的问题之后,我将其发布,因为它们不能解决我的问题。最受欢迎的错误是使用module.export
而不是module.exports
并调用了模式的新实例而不是模型。我没有犯这些错误。这是代码。
const db = require('mongoose');
db.Promise = global.Promise;
db.connect(process.env.MONGODB_URI || 'mongodb://localhost/mydb').then(
() => {console.log('Connection to database established')}
).catch((err) => {
console.log(err);
});
module.exports = {db};
const {db} = require('./dbconf');
// Schema for users
let UserSchema = new db.Schema({
username : {
type : String,
required : true,
trim : true,
min : 1,
unique: true
},
password : {
type : String,
required : true,
trim : true,
min : 8
},
name : {
type : String,
required : true,
trim : true,
min : 1
},
email : {
type : String,
required : true,
trim : true,
min : 1,
unique : true
}
});
const User = db.model('User', UserSchema);
module.exports = {User};
const {User} = require('../db/models');
let user = new User({
username : username,
password : password,
name : name,
email : email
});
在let user = new User({
,我得到TypeError: User is not a constructor
答案 0 :(得分:0)
我记得webpack / typescript有类似的问题。
尝试像
那样导出模块module.exports.User = User;
并在不使用析构函数的情况下导入整个数据库索引文件...只是看看它是否有所不同。
const models = require('../db/models');
const user = new models.User(...);
就我而言,这是webpack搞砸了进口的事情。
快速编辑: 我创建了与您相同的设置(带有最新的猫鼬)。
// models file
const userSchema = new Schema({
message: { type: String, maxlength: 5000 }
});
const User = mongoose.model('User', userSchema);
module.exports.User = User;
// another file
const { User } = require('./testmodels.js');
console.log('==>', User );
will log out
==> function model(doc, fields, skipId) {
model.hooks.execPreSync('createModel', doc);
if (!(this instanceof model)) {
return new model(doc, fields, skipId);
}
const discriminatorKey = model.schema.options.discriminatorKey;
if (model.discriminators == null || doc == null || doc[discriminatorKey] == null) {
Model.call(this, doc, fields, skipId);
return;
}
// If discriminator key is set, use the discriminator instead (gh-7586)
const Discriminator = model.discriminators[doc[discriminatorKey]] ||
getDiscriminatorByValue(model, doc[discriminatorKey]);
if (Discriminator != null) {
return new Discriminator(doc, fields, skipId);
}
// Otherwise, just use the top-level model
Model.call(this, doc, fields, skipId);
}
出于好奇,如果尝试这样调用构造函数,会发生什么情况。
let user = new User.User({
username : username,
password : password,
name : name,
email : email
});
另一个更新: 我试用了您的示例代码,它对我有用(我也用最新的Mongo版本进行了测试,但仍然可以使用)。 在您的示例中,我唯一需要更改的是模块导出行,您仅在其中导出了MK,而没有导出用户模型。
module.exports = {User, SigningKey, MK};