Невозможно перезаписать модель после компиляции Мангуста



не уверен, что я делаю неправильно, вот мой чек.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
}
>
714   15  

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);

определение схемы должно быть уникальным для коллекции, оно не должно быть более одной схемы для коллекции.

эта проблема может возникнуть, если вы определяете 2 разные схемы с одинаковым именем коллекции

это потому, что ваша схема уже, проверьте перед созданием новой схемы.

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

    Ничего не найдено.