Невозможно перезаписать «пользовательскую» модель после компиляции при добавлении второй схемы в базу данных. [Дубликат]

Вы также можете попытаться использовать print.function(), который является S3 generic, чтобы получить функцию записи в консоли.

54
задан devprashant 19 July 2016 в 19:08
поделиться

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

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); 
});
70
ответ дан thtsigma 19 August 2018 в 00:27
поделиться
  • 1
    Избегайте экспорта / требующих моделей - если есть ref s для других моделей, это может привести к кошмару зависимости. Используйте var User = mongoose.model('user') вместо require. – wprl 27 September 2013 в 15:30
  • 2
    На самом деле может быть полезно изменить схему после определения для тестирования кода схемы схемы. – Igor Soarez 28 January 2014 в 20:21
  • 3

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

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

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

let users = mongoose.model('users')

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

let users
try {
  users = mongoose.model('users')
} catch (error) {
  users = mongoose.model('users', <UsersSchema...>)
}
26
ответ дан BJ Anderson 19 August 2018 в 00:27
поделиться
  • 1
    +1 У меня была такая же проблема, когда мне нужно было настроить какую-то конфигурацию для плагина, прежде чем я смогу определить мою схему. Это не очень хорошо сочеталось с моккой, и в конце я сдался и просто пошел с этим методом подбора проб – Victor Parmar 10 October 2016 в 20:54
  • 2
    Я использую то же самое, но наоборот, это нечестиво: try exports.getModel = ()-> mongoose.model('User', userSchema) catch err exports.getModel = ()-> mongoose.model('User') – Andi Giga 2 June 2017 в 08:34

заключается в том, что ваша схема уже проверена перед созданием новой схемы.

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);
0
ответ дан Diego Santa Cruz Mendezú 19 August 2018 в 00:27
поделиться

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

-4
ответ дан Elesin Olalekan Fuad 19 August 2018 в 00:27
поделиться
  • 1
    это не имеет смысла, модели mongoose определяются только один раз, если не возникает проблема с именованием (например, случай), как только она сначала называется инициализированной, будущие требования должны просто получить экземпляр, а не повторно установить его – jonnie 27 January 2016 в 20:12

Это произошло со мной, когда я пишу так:

import User from '../myuser/User.js';

Однако истинный путь «../myUser/User.js'

3
ответ дан ip192 19 August 2018 в 00:27
поделиться
  • 1
    Случай смешивания путей схемы при импорте, похоже, вызывает эту проблему - убедитесь, что все файлы, импортирующие схему, используют один и тот же случай. – Andrew Cupper 23 September 2017 в 04:49

Если вы сделали это здесь, возможно, у вас была та же проблема, что и я. Моя проблема заключалась в том, что я определял другую модель с тем же именем. Я назвал свою галерею и мою файловую модель «Файл». Дарн вы копируете и вставляете!

10
ответ дан James Harrington 19 August 2018 в 00:27
поделиться
  • 1
    Вы хотели бы поделиться, почему это было проголосовано? – James Harrington 27 April 2018 в 19:34

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

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

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

109
ответ дан jonnie 19 August 2018 в 00:27
поделиться
  • 1
    На самом деле это очень сложная проблема - я думаю, что она специфична для ОС (это должно произойти только на Mac и Windows, поскольку FS игнорирует этот случай). У меня была эта проблема, но, к счастью, я увидел ваш ответ :) Большое спасибо Jonnie! – Miroslav Nedyalkov 23 December 2015 в 14:11
  • 2
    эта проблема возникает в моей системе OS X. – lutaoact 18 February 2016 в 14:05
  • 3
    Это была моя проблема. Спасибо что подметил это! – MCTaylor17 18 July 2016 в 23:18
  • 4
    Я бы никогда не подумал об этом, по крайней мере, не интуитивно! благодаря – Naveen Attri 28 September 2016 в 20:27
  • 5
    Это была моя проблема. Я никогда не думал, что имя с верхним номером никогда не вызовет никаких проблем. – Sandip Subedi 18 November 2016 в 19:11

Если вы используете автономный сервер без сервера и не хотите использовать --skipCacheInvalidation, вы можете очень хорошо использовать:

module.exports = mongoose.models.Users || mongoose.model('Users', UsersSchema);
2
ответ дан Julian 19 August 2018 в 00:27
поделиться

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

0
ответ дан KARTHIKEYAN.A 19 August 2018 в 00:27
поделиться

Я знаю, что есть принятое решение, но я чувствую, что текущее решение приводит к большому количеству шаблонов, чтобы вы могли тестировать Модели. Мое решение состоит в том, чтобы взять модель и поместить ее внутри функции, что приведет к возврату новой модели, если модель не была зарегистрирована, но возвращает существующую модель, если она есть.

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

Открытие и закрытие соединения повсюду разочаровывают и плохо сжимаются.

Таким образом, если я должен был потребовать от модели два разных места или, более конкретно, в своих тестах, я бы не стал получать ошибки, и вся правильная информация вернулся.

3
ответ дан Moosecouture 19 August 2018 в 00:27
поделиться
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" } });
0
ответ дан Rohit 19 August 2018 в 00:27
поделиться

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

0
ответ дан Rohit Reddy Abbadi 19 August 2018 в 00:27
поделиться

Я столкнулся с этой проблемой & amp; это произошло не из-за определений схемы, а из режима безсерверного автономного режима - мне просто удалось разрешить это с помощью этого:

serverless offline --skipCacheInvalidation

Что упоминается здесь https://github.com/dherault / serverless-offline / issues / 258

Надеюсь, это поможет кому-то другому, кто строит свой проект на сервере без сервера и работает в автономном режиме.

10
ответ дан user5301210 19 August 2018 в 00:27
поделиться
  • 1
    Очень полезно. Благодарю. – Thanh Truong 18 April 2018 в 20:51
  • 2
    Мне было досадно пропускать недействительность кэша, постоянную перезагрузку, вместо этого это работает module.exports = mongoose.models.Users || mongoose.model('Users', UsersSchema); – asked_io 11 May 2018 в 04:19
  • 3
    вы сделали мой день – fstasi 23 July 2018 в 20:00
  • 4
    – AndyFaizan 18 October 2018 в 14:12

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

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

import mongoose from 'mongoose';
import user from './schemas/user';

export const User = mongoose.models.User || mongoose.model('User', user);
16
ответ дан ZephDavies 19 August 2018 в 00:27
поделиться
  • 1
    Это сработало для меня. Я изменил module.export = User на export defaults User. У меня также был refs для пользователя из других моделей. Я не уверен, почему изменение с module.exports до export default привело к этой проблеме. Тем не менее, этот ответ, похоже, исправил это. – runios 26 February 2018 в 09:11
  • 2
    to bad mongoose.models не существует, по крайней мере, в последних версиях – Pedro Luz 25 April 2018 в 10:58
  • 3
    У меня была та же проблема, но я исправил ее, очистив все модели до всех тестов: for (let model in mongoose.models) delete mongoose.models[model] – E. Sundin 17 June 2018 в 21:02
0
ответ дан pihyper 30 October 2018 в 12:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: