Невозможно перезаписать модель после компиляции Мангуста
не уверен, что я делаю неправильно, вот мой чек.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 })
});
и вот моя вставка.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);
});
всякий раз, когда я пытаюсь запустить проверку.js, я получаю эту ошибку
невозможно перезаписать модель "пользователи" после компиляции.
Я понимаю, что эта ошибка возникает из-за несоответствия схемы, но я не вижу, где это происходит ? Я довольно новичок в мангусте и 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" : "[email protected]",
"password" : "myPassword",
"phone" : 900001123,
"_enable" : true
}
>
15 ответов:
ошибка возникает, потому что у вас уже есть определенная схема, а затем вы снова определяете схему. Как правило, вы должны создать экземпляр схемы один раз, а затем вызвать ее глобальный объект, когда это необходимо.
например:
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);проверка.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 }) });вставить.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); });
Так что еще одна причина, почему вы можете получить эту ошибку, если вы используете ту же модель в разных файлах, но ваш
requireпуть был другой случай. Например в моей ситуации у меня было:
require('./models/User')в одном файле, а затем в другом файле, где мне нужен был доступ к пользовательской модели, которую я имелrequire('./models/user').Я думаю, что поиск модулей и мангустов рассматривает его как другой файл. Как только я убедился, что случай соответствует обоим, это больше не было проблемой.
у меня была эта проблема во время модульного тестирования.
при первом вызове функции создания модели, Мангуст хранит модель под ключом, который вы предоставляете (например, "пользователи"). Если вы вызываете функцию создания модели с одним и тем же ключом несколько раз, мангуст не позволит вам перезаписать существующую модель.
Вы можете проверить, если модель уже существует в мангуста с:
let users = mongoose.model('users')это вызовет ошибку, если модель не существует, поэтому вы можете обернуть ее в a попробуйте / поймать для того, чтобы либо получить модель, либо создать ее:
let users try { users = mongoose.model('users') } catch (error) { users = mongoose.model('users', <UsersSchema...>) }
У меня была эта проблема во время "просмотра" тестов. Когда тесты были отредактированы, часы повторно запустили тесты, но они не смогли по этой самой причине.
я исправил это, проверив, существует ли модель, а затем используйте ее, иначе создайте ее.
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
надеюсь, что это помогает кто-то, кто строит свой проект по данной, и работает в автономном режиме.
Я знаю, что есть принятое решение, но я чувствую, что текущее решение приводит к большому количеству шаблонов, чтобы вы могли тестировать модели. Мое решение состоит в том, чтобы взять модель и поместить ее внутри функции, что приведет к возвращению новой модели, если модель не была зарегистрирована, но возвращает существующую модель, если она есть.
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()Открытие и закрытие соединений по всему месту расстраивает и не сжимает хорошо.
таким образом, если Я должен был требовать модель в двух разных местах или, более конкретно, в моих тестах я бы не получил ошибок, и вся правильная информация возвращается.
Это случилось со мной, когда я пишу так:
import User from '../myuser/User.js';Однако, истинный путь '../мой_логин/пользователей.js'
Если вы используете бессерверный оффлайн и не хотите использовать
--skipCacheInvalidation, вы можете очень хорошо использовать:module.exports = mongoose.models.Users || mongoose.model('Users', UsersSchema);
определение схемы должно быть уникальным для коллекции, оно не должно быть более одной схемы для коллекции.
это потому, что ваша схема уже, проверьте перед созданием новой схемы.
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);
If you want to overwrite the existing class for different collection using typescript then you have to inherit the existing class from different class. export class User extends Typegoose{ @prop username?:string password?:string } export class newUser extends User{ constructor() { super(); } } export const UserModel = new User ().getModelForClass(User , { schemaOptions: { collection: "collection1" } }); export const newUserModel = new newUser ().getModelForClass(newUser , { schemaOptions: { collection: "collection2" } });
вы можете легко решить эту проблему, выполнив
delete mongoose.connection.models['users']; const usersSchema = mongoose.Schema({...}); export default mongoose.model('users', usersSchema);
Если вы работаете с expressjs, вам может потребоваться переместить определение модели за пределы приложения.get () поэтому он вызывается только один раз, когда создается экземпляр сценария.
Comments