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