编译Mongoose后无法覆盖模型

不知道我做错了什么,这是我的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,我得到这个错误

编译后无法覆盖“用户”模型

我明白,这个错误是由于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 } > 

发生该错误的原因是您已经定义了一个模式,然后再次定义该模式。 一般情况下,你应该做的是一次实例化模式,然后让全局对象在需要时调用它。

例如:

user_model.js

 var mongoose = require('mongoose'); var Schema = mongoose.Schema; var userSchema = new Schema({ name:String, email:String, password:String, phone:Number, _enabled:Boolean }); module.exports = mongoose.model('users', userSchema); 

check.js

 var mongoose = require('mongoose'); var User = require('./user_model.js'); var db = mongoose.createConnection('localhost', 'event-db'); db.on('error', console.error.bind(console, 'connection error:')); var a1= db.once('open',function(){ User.find({},{},function (err, users) { mongoose.connection.close(); console.log("Username supplied"+username); //doSomethingHere }) }); 

insert.js

 var mongoose = require('mongoose'); var User = require('./user_model.js'); mongoose.connect('mongodb://localhost/event-db'); 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); }); 

所以你可能会得到这个错误的另一个原因是,如果你在不同的文件中使用相同的模型,但你的requirepath有不同的情况。 例如在我的情况下,我有:

在一个文件中require('./models/User') ,然后在另一个需要访问用户模型的文件中require('./models/user')

我想查找模块和mongoose是把它作为一个不同的文件。 一旦我确定案件匹配,这不再是一个问题。

我在unit testing时遇到了这个问题。

您第一次调用模型创buildfunction时,mongoose会将模型存储在您提供的密钥下(例如“用户”)。 如果您多次使用同一个键调用模型创build函数,mongoose不会让您覆盖现有的模型。

你可以检查模型是否已经存在mongoose与:

 let users = mongoose.model('users') 

如果模型不存在,这会抛出一个错误,所以你可以把它包装在一个try / catch中,以获得模型或者创build它:

 let users try { users = mongoose.model('users') } catch (error) { users = mongoose.model('users', <UsersSchema...>) } 

如果你在这里做的话,你可能会遇到和我一样的问题。 我的问题是, 我正在定义另一个同名的模型 。 我打电话给我的画廊和我的文件模型“文件”。 让你复制并粘贴!

我在看“testing时遇到了这个问题。 当编辑testing时,手表重新运行testing,但由于这个原因失败了。

我通过检查模型是否存在然后使用它来修复它,否则创build它。

 import mongoose from 'mongoose'; import user from './schemas/user'; export const User = mongoose.models.User || mongoose.model('User', user); 

我一直在遇到这个问题,这不是因为模式定义,而是无服务器的离线模式 – 我只是设法解决这个问题:

 serverless offline --skipCacheInvalidation 

这里提到https://github.com/dherault/serverless-offline/issues/258

希望能够帮助别人构build无服务器并运行离线模式的项目。

当我这样写时,这发生在我身上:

 import User from '../myuser/User.js'; 

但是,真正的path是“../myUser/User.js”

我知道有一个可以接受的解决scheme,但是我觉得目前的解决scheme会产生大量的样板,以便您可以testing模型。 我的解决scheme本质上是把你的模型放在一个函数的内部,如果模型没有被注册,返回新的模型,但是返回现有的模型。

 function getDemo () { // Create your Schema const DemoSchema = new mongoose.Schema({ name: String, email: String }, { collection: 'demo' }) // Check to see if the model has been registered with mongoose // if it exists return that model if (mongoose.models && mongoose.models.Demo) return mongoose.models.Demo // if no current model exists register and return new model return mongoose.model('Demo', DemoSchema) } export const Demo = getDemo() 

开放和closures连接到处都是令人沮丧,压缩不好。

这样,如果我需要模型两个不同的地方或更具体地在我的testing中,我不会得到错误,并返回所有正确的信息。

模式定义对集合来说应该是唯一的,它不应该是一个集合的一个模式。

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