无法编译模型,因为已经被编译过了 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个回答

1
根据答案:https://dev59.com/jWIk5IYBdhLWcg3wr_9o#34291140,它部分地解决了这个问题,但也在代码中引发了另一个错误。

Error

如果不存在该模型,则可以通过导出新模型来解决此问题。我知道这与那个答案中的想法相同,但现在实现方式不同了。

/// ... your schema

const model = mongoose.models.Model || mongoose.model("Model", modelSchema);

export default model;

1

有很多好的答案,但为了检查,我们可以做得更简单。 我的意思是,在最流行的答案中,有一个check.js,我们的人把它弄得太复杂了,我建议:

function connectToDB() {
  if (mongoose.connection.readyState === 1) {
    console.log("already connected");
    return;
  }
  mongoose.connect(
    process.env.MONGODB_URL,
    {
      useCreateIndex: true,
      useFindAndModify: false,
      useNewUrlParser: true,
      useUnifiedTopology: true,
    },
    (err) => {
      if (err) throw err;
      console.log("DB connected");
    },
  );
}

readyState== 1 表示已连接
所以不要再尝试连接
这样就不会出错了
我认为是因为连接时已经处于连接状态
这是另一种连接数据库的方式


1
解决了这行代码的问题。
最后一行。
module.exports =
    mongoose.models.Customer || mongoose.model('Customer', customerSchema);

0

这是因为您的模式已经存在,请在创建新模式之前进行验证。

var mongoose = require('mongoose');
module.exports = function () {
var db = require("../libs/db-connection")();
//schema de mongoose
var Schema = require("mongoose").Schema;

var Task = Schema({
    field1: String,
    field2: String,
    field3: Number,
    field4: Boolean,
    field5: Date
})

if(mongoose.models && mongoose.models.tasks) return mongoose.models.tasks;

return mongoose.model('tasks', Task);

0
如果您正在使用Serverless离线功能,其中一个应该可以解决问题。
--skipCacheInvalidation

或者

--useSeparateProcesses

特别是当前这个

--useChildProcesses

0

我有这样一种情况,每个请求都必须动态创建模型,因此我遇到了这个错误,不过我用来解决它的方法是使用以下的 deleteModel 方法:

var contentType = 'Product'

var contentSchema = new mongoose.Schema(schema, virtuals);

var model = mongoose.model(contentType, contentSchema);

mongoose.deleteModel(contentType);

希望这能对任何人有所帮助。


0
请确保您写正确的语法,例如:
错误的语法
export default mongoose.model.Users || mongoose.model("Users", UsersSchema);

正确的语法
export default mongoose.models.Users || mongoose.model("Users", UsersSchema);

我曾经看到很多人在OR运算符之前写成mongoose.model而不是mongoose.models

0

对于因为代码库混合使用TypegooseMongoose而到达这里的所有人:

为每个创建一个数据库连接:

Mongoose:

module.exports = db_mongoose.model("Car", CarSchema);

Typegoose:

db_typegoose.model("Car", CarModel.schema, "cars");

0
The reason of this issue is: 

you given the model name "users" in the line 
<<<var user = mongoose.model('users' {>>> in check.js file

and again the same model name you are giving in the insert file
<<< var user = mongoose.model('users',{ >>> in insert.js

This "users" name shouldn't be same when you declare a model that should be different 
in a same project.

0
mongoose.models = {}

这个解决方案解决了我的问题


目前你的回答不够清晰,请编辑并添加更多细节,以帮助其他人理解它如何回答问题。你可以在帮助中心找到有关如何编写好答案的更多信息。 - Community
你好,许多年前已有一个已接受的答案。您确定您的解决方案在原始比赛中可行吗? - pierpy
嗨,已经有一个被接受的答案,很多年前了。你确定你的解决方案适用于原始竞赛吗? - undefined

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