Ana*_*ued 80 model mongoose mongodb node.js express
不确定我做错了什么,这是我的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 
  } 
>
jon*_*nie 147
因此,您可能会遇到此错误的另一个原因是,如果您在不同的文件中使用相同的模型,但您的require路径具有不同的情况.例如,在我的情况下,我有:
require('./models/User')在一个文件中,然后在另一个文件中我需要访问我的用户模型require('./models/user').
我想查找模块和mongoose将其视为一个不同的文件.一旦我确定案件匹配,这不再是一个问题.
tht*_*gma 94
发生错误是因为您已经定义了架构,然后再次定义架构.通常,您应该做的是将模式实例化一次,然后让全局对象在需要时调用它.
例如:
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); 
});
小智 39
单元测试时遇到了这个问题.
第一次调用模型创建函数时,mongoose将模型存储在您提供的密钥下(例如"用户").如果您多次使用相同的键调用模型创建函数,则mongoose将不允许您覆盖现有模型.
你可以检查模型是否已经存在于mongoose中:
let users = mongoose.model('users')
如果模型不存在,这将抛出错误,因此您可以将其包装在try/catch中以获取模型或创建模型:
let users
try {
  users = mongoose.model('users')
} catch (error) {
  users = mongoose.model('users', <UsersSchema...>)
}
Zep*_*ies 33
"观察"测试时我遇到了这个问题.编辑测试后,手表会重新进行测试,但由于这个原因导致测试失败.
我通过检查模型是否存在然后使用它来修复它,否则创建它.
import mongoose from 'mongoose';
import user from './schemas/user';
export const User = mongoose.models.User || mongoose.model('User', user);
小智 20
我一直在遇到这个问题,这不是因为模式定义而是因为无服务器离线模式 - 我只是设法解决它:
serverless offline --skipCacheInvalidation
这里提到的https://github.com/dherault/serverless-offline/issues/258
希望这可以帮助在无服务器和运行脱机模式下构建项目的其他人.
Jul*_*ian 15
如果您正在离线使用无服务器,并且不想使用--skipCacheInvalidation,那么可以很好地使用:
module.exports = mongoose.models.Users || mongoose.model('Users', UsersSchema);
小智 14
点击这里!官方示例。最重要的!事情是这样导出的
export default mongoose.models.Item || mongoose.model('Item', itemsSchema)
小智 8
当我这样写时,这发生在我身上:
import User from '../myuser/User.js';
但是,真正的路径是'../myUser/User.js'
小智 7
要解决此问题,请在创建模型之前检查模型是否存在:
if (!mongoose.models[entityDBName]) {
  return mongoose.model(entityDBName, entitySchema);
}
else {
  return mongoose.models[entityDBName];
}
我通过添加解决了这个问题
mongoose.models = {}
前行:
mongoose.model(<MODEL_NAME>, <MODEL_SCHEMA>)
希望它能解决您的问题
我知道有一个可接受的解决方案,但我觉得当前的解决方案会产生很多样板文件,以便您可以测试模型。我的解决方案本质上是将您的模型放入一个函数中,如果模型尚未注册,则返回新模型,但如果已注册,则返回现有模型。
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()
到处打开和关闭连接令人沮丧并且不能很好地压缩。
这样,如果我要在两个不同的地方或更具体地在我的测试中要求模型,我就不会出错,并且会返回所有正确的信息。
小智 5
这可能会对某些人造成打击,但我也遇到了错误,并意识到我只是在导入时拼错了用户模型。
错误:const User = require('./UserModel');
正确:const User = require('./userModel');
难以置信,但考虑一下。
这是发生这种情况的另一个原因。也许这可以帮助别人。请注意会员与会员之间的区别。他们一定是同一个人...
export default mongoose.models.Members || mongoose.model('Member', FamilySchema)
改成:
export default mongoose.models.Member || mongoose.model('Member', FamilySchema)
| 归档时间: | 
 | 
| 查看次数: | 77574 次 | 
| 最近记录: |