Невозможно перезаписать модель после компиляции 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, я получаю эту ошибку

Невозможно перезаписать «пользовательскую» модель после компиляции .

Я понимаю, что эта ошибка возникает из-за несоответствия Схемы, но я не вижу, где это происходит? Я довольно новичок в 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 } > 

14 Solutions collect form web for “Невозможно перезаписать модель после компиляции Mongoose”

Ошибка возникает из-за того, что у вас уже определена схема, а затем вы снова определяете схему. Как правило, вам нужно создать экземпляр схемы один раз, а затем глобальный объект вызовет его, когда ему это нужно.

Например:

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

Итак, другой причиной, почему вы можете получить эту ошибку, является то, что вы используете одну и ту же модель в разных файлах, но ваш путь require другого. Например, в моей ситуации у меня было:

require('./models/User') в одном файле, а затем в другом файле, где мне нужен доступ к модели пользователя, которую я require('./models/user') .

Я предполагаю, что поиск модhive & mongoose рассматривает его как другой файл. Как только я убедился, что дело совпало с этим, это уже не проблема.

У меня была эта проблема во время модульного тестирования.

При первом вызове функции создания модели mongoose хранит модель под ключом, который вы предоставляете (например, «пользователи»). Если вы вызываете функцию создания модели одним и тем же ключом более одного раза, mongoose не позволит вам перезаписать существующую модель.

Вы можете проверить, существует ли модель в мангусте с:

 let users = mongoose.model('users') 

Это вызовет ошибку, если модель не существует, поэтому вы можете ее обернуть в try / catch, чтобы либо получить модель, либо создать ее:

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

У меня была эта проблема, когда я смотрел тесты. Когда тесты были отредактированы, часы повторно запускали тесты, но по этой причине они потерпели неудачу.

Я исправил это, проверив, существует ли модель, затем используйте ее, иначе создайте ее.

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

Однако истинным путем является «../myUser/User.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" } }); 

Если вы работаете с expressjs, вам может потребоваться переместить определение модели за пределы app.get (), поэтому он вызывается только один раз, когда скрипт создается.

  • (узел: 3341) Устаревание Предупреждение: Mongoose: mpromise
  • NodeJS: как отлаживать обнаруженную утечку памяти EventEmitter. 11 слушателей добавили "
  • Не удалось установить пакет npm "npm ERR! errno -4048 "
  • Присвоение имени домена локальному хосту для среды разработки
  • Узел / Экспресс: EADDRINUSE, адрес уже используется - Убейте сервер
  • Socket.io + Node.js Запрос на перекрестный запрос заблокирован
  • Как я могу запросить различные значения в Mongoose?
  • Как очистить настройки прокси-сервера https для NPM?
  • Какую библиотеку websocket использовать с Node.js?
  • $ искать несколько уровней без $ unwind?
  • Исправление npm-пути в Windows 8 и 10
  • Interesting Posts

    См. Недавнюю задачу Android, выполненную пользователем.

    Доступ к BIOS на Toshiba Satellite C55-A?

    Настройка экспортного шаблона org-mode?

    Расширение для Chrome, которое перенаправляет вас на существующую вкладку, если вы попытаетесь открыть тот же URL

    Как получить старое значение измененной ячейки в Excel VBA?

    Извлечение данных между двумя символами в Excel

    Как создать текстовый файл и вставить данные в этот файл на Android

    Поддерживает ли Win7 планирование резервного копирования образа системы?

    Изменение разрешения по умолчанию для подключения к удаленному рабочему столу (mstsc)

    Как использовать openURL для совершения телефонного звонка в Swift?

    Обновить fragment при перезагрузке

    Изменение шрифта окна консоли DEFAULT в Windows 10

    Как настроить routeProvider и locationProvider в angularJS?

    Как создать Windows 8.1 с установочным носителем Bing?

    Как заблокировать видео html5 в системе

    Давайте будем гением компьютера.