无法编译模型,因为已经被编译过了 Mongoose

205

我不确定我做错了什么,这是我的check.js文件:

var db = mongoose.createConnection('localhost', 'event-db');
db.on('error', console.error.bind(console, 'connection error:'));

var a1= db.once('open',function(){
var user = mongoose.model('users',{ 
       name:String,
       email:String,
       password:String,
       phone:Number,
      _enabled:Boolean
     });

user.find({},{},function (err, users) {
    mongoose.connection.close();
    console.log("Username supplied"+username);
    //doSomethingHere })
    });

这是我的insert.js文件

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/event-db')

var user = mongoose.model('users',{
     name:String,
     email:String,
     password: String,
     phone:Number,
     _enabled:Boolean
   });

var new_user = new user({
     name:req.body.name,
     email: req.body.email,
     password: req.body.password,
     phone: req.body.phone,
     _enabled:false
   });

new_user.save(function(err){
    if(err) console.log(err); 
   });

每当我尝试运行check.js时,都会出现以下错误:

无法在编译后覆盖“users”模型

我知道这个错误是由Schema不匹配造成的,但我看不出具体哪里出了问题?我对mongoose和nodeJS相当陌生。

以下是我从MongoDB客户端界面上获取的信息:

MongoDB shell version: 2.4.6 connecting to: test 
> use event-db 
  switched to db event-db 
> db.users.find() 
  { "_id" : ObjectId("52457d8718f83293205aaa95"), 
    "name" : "MyName", 
    "email" : "myemail@me.com", 
    "password" : "myPassword", 
    "phone" : 900001123, 
    "_enable" : true 
  } 
>

这是我从MongoDB客户端接口获取的信息: MongoDB shell版本:2.4.6 连接到:测试
use event-db 切换到数据库event-db db.users.find() { "_id" : ObjectId("52457d8718f83293205aaa95"), "name" : "MyName", "email" : "myemail@me.com", "password" : "myPassword", "phone" : 900001123, "_enable" : true }
- Anathema.Imbued
有时候我们犯的错误很愚蠢,就像我的情况一样:导出文件的代码是这样的{userModel:model("user",userSchema)...所以每次访问该文件时都会重新创建模型并触发错误...因此,不要像这样导出,而是创建一个常量"const userModel=model("user",userSchema),然后像这样导出module.exports = { userModel }。 - Bakaji
50个回答

0
如果错误仍然存在,请在 models/[your_model].js 中的代码中添加以下行:
delete mongoose.connection.models['your_model'];
这将从 Mongoose 模型缓存中删除 Product 模型,允许您重新定义它。

0

添加这行代码将百分之百解决你的错误。

mongoose.models = {}

2
目前你的回答不够清晰,请编辑并添加更多细节,以帮助其他人理解它如何回答问题。你可以在帮助中心找到有关如何编写好答案的更多信息。 - Community

0
var user = mongoose.model('users', {});

在这里,你在两个地方都使用了“users”,它们是相同的,因此存在冲突,因此一个无法覆盖另一个。为了解决这个问题,请将它们更改。


0

由于此问题是因为再次调用模型而发生的。解决此问题的方法是将您的模型代码包装在try catch块中。 TypeScript代码如下 -

         Import {Schema, model} from 'mongoose';
         export function user(){
              try{
                   return model('user', new Schema ({
                            FirstName: String,
                            Last name: String
                     }));
              }
             catch{
                   return model('user');
              }
         }

同样地,你也可以用 JavaScript 写代码。


0

我只是复制粘贴时犯了一个错误。在一行中,我使用了与其他模型(广告模型)相同的名称:

const Admin = mongoose.model('Ad', adminSchema);

正确的写法是:

const Admin = mongoose.model('Admin', adminSchema);

顺便说一下,如果有人使用“自动保存”,并且在查询中使用索引:
**adSchema**.index({title:"text", description:"text", phone:"text", reference:"text"})

需要删除索引,并重新编写以获得正确的模型:

**adminSchema**.index({title:"text", description:"text", phone:"text", reference:"text"})

0
In my case, i had file structure like this
Modules
-> User
   ->controllers
   ->models
      ->user.model.js
      ->userDetails.model.js
   ->Repository
      ->user.repository.js
      ->userdetails.repository.js
-> Posts
   // same as model

In my repository folder I referenced model like so

      const User = require("../models/user.model") 

but this yelled at me.
All I did to solve this was give a reference of 

    const User = require("../../User/models/user.model")

This solved the problem.. 
happy Hacking

0
这个解决方案很有效,但是存在一个问题,即模式的类型信息丢失了。
export default mongoose.models.Users || mongoose.model("Users", UsersSchema);

所以我找到了这个优雅的解决方案。
export default mongoose.models.Users as unknown as null ?? model("Users", UsersSchema)

从这里开始。 https://qiita.com/mrin/items/43fb1c703f6f5a0ff56c

-1

我的错误,在其他模型中使用了相同的名称“Users”



const ProductSchema = new mongoose.Schema({
    title: { type: String, required: true, unique: true },
    desc: { type: String, required: true },
    img: { type: String, required: true },
    categorires: { type: Array },
    size: { type: String },
    color: { type: String },
    price: { type: Number, required: true },
},
    { timestamps: true }
);

module.exports = mongoose.model("User", ProductSchema);```



*** Edit this line by me work look in your madels ***


module.exports = mongoose.model("Product", ProductSchema)


人类会犯错,为什么你不喜欢我的错误呢?我只是复制了代码并将其粘贴到其他文件中,忘记更改一个愚蠢的单词。 - Prashant Chouhan

-1

你在check.js和insert.js中使用了相同的变量名"user",并且使用了mongoose.model。


-3
如果您正在使用expressjs,您可能需要将模型定义移动到app.get()之外,以便在脚本实例化时仅调用一次。

这没有意义,mongoose 模型只定义一次,除非命名有问题(例如大小写),一旦第一次调用它就被初始化了,未来的 requires 应该只获取实例而不是重新实例化它。 - jonnie
这不是一个解决方案。 - Prathamesh More

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接