Не уверен, что делаю не так, вот мой 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
}
>
Ответы:
Ошибка возникает из-за того, что у вас уже определена схема, а затем вы снова ее определяете. Как правило, вам следует создать экземпляр схемы один раз, а затем вызвать ее глобальный объект, когда это потребуется.
Например:
user_model.js
check.js
insert.js
источник
ref
к другим моделям, это может привести к кошмару зависимостей. Используйтеvar User = mongoose.model('user')
вместоrequire
.Итак, еще одна причина, по которой вы можете получить эту ошибку, заключается в том, что вы используете одну и ту же модель в разных файлах, но ваш
require
путь имеет другой регистр. Например, в моей ситуации у меня было:require('./models/User')
в одном файле, а затем в другом, где мне нужен был доступ к модели User, которая у меня былаrequire('./models/user')
.Я предполагаю, что поиск модулей и mongoose рассматривает его как другой файл. Как только я убедился, что корпус соответствует обоим, это больше не было проблемой.
источник
У меня возникла эта проблема во время модульного тестирования.
При первом вызове функции создания модели mongoose сохраняет модель под указанным вами ключом (например, «пользователи»). Если вы вызовете функцию создания модели с одним и тем же ключом более одного раза, мангуст не позволит вам перезаписать существующую модель.
Вы можете проверить, существует ли уже модель в мангусте с помощью:
Это вызовет ошибку, если модель не существует, поэтому вы можете обернуть ее в try / catch, чтобы либо получить модель, либо создать ее:
источник
try exports.getModel = ()-> mongoose.model('User', userSchema) catch err exports.getModel = ()-> mongoose.model('User')
У меня возникла эта проблема во время просмотра тестов. Когда тесты были отредактированы, часы повторно запустили тесты, но они потерпели неудачу именно по этой причине.
Я исправил это, проверив, существует ли модель, затем используйте ее, иначе создайте ее.
источник
module.export = User
кexport defaults User
. Еще мне пришлосьrefs
User от других моделей. Я не понимаю, почему при переходе сmodule.exports
наexport default
возникла эта проблема. Тем не менее, этот ответ, кажется, исправил это.mongoose.models
не существует, по крайней мере, в последних версияхfor (let model in mongoose.models) delete mongoose.models[model]
"test": "NODE_ENV=test mocha --file mocha.config.js --watch"
и в этом js-файле конфигурации у меня естьbefore()
иafter()
для настройки и демонтажа. @ E.Sundin предоставил здесь идеальное решение, и оно прекрасно работает. Спасибо!У меня возникла эта проблема, и это было не из-за определений схемы, а скорее из-за бессерверного автономного режима - мне просто удалось решить ее с помощью этого:
Это упомянуто здесь https://github.com/dherault/serverless-offline/issues/258
Надеюсь, это поможет кому-то еще, кто строит свой проект в бессерверном режиме и работает в автономном режиме.
источник
module.exports = mongoose.models.Users || mongoose.model('Users', UsersSchema);
Если вы используете Serverless в автономном режиме и не хотите использовать
--skipCacheInvalidation
, вы можете очень хорошо использовать:источник
--skipCacheInvalidation
Если вы сделали это здесь, возможно, у вас была та же проблема, что и у меня. Моя проблема заключалась в том, что я определял другую модель с тем же именем . Я назвал свою галерею и мою файловую модель «Файл». Черт возьми, копируешь и вставляешь!
источник
Это случилось со мной, когда я писал вот так:
Однако истинный путь - "../myUser/User.js".
источник
Я решил это, добавив
перед строкой:
Надеюсь, это решит вашу проблему
источник
mongoose.connection.models = {};
Чтобы решить эту проблему, проверьте, существует ли модель до создания:
источник
Я знаю, что есть приемлемое решение, но я чувствую, что текущее решение приводит к большому количеству шаблонов, чтобы вы могли тестировать модели. Мое решение состоит в том, чтобы взять вашу модель и поместить ее внутри функции, что приведет к возврату новой модели, если модель не была зарегистрирована, но возврату существующей модели, если она есть.
Открытие и закрытие соединений повсюду раздражает и плохо сжимается.
Таким образом, если бы я потребовал модель в двух разных местах или, более конкретно, в моих тестах, я бы не получил ошибок, и была бы возвращена вся правильная информация.
источник
Эта проблема может возникнуть, если вы определите две разные схемы с одинаковым именем коллекции.
источник
источник
У меня была та же проблема, причина в том, что я определил схему как модель в функции JS, они должны быть определены глобально в модуле узла, а не в функции.
источник
Есть еще один способ выбросить эту ошибку.
Имейте в виду, что путь к модели чувствителен к регистру.
В этом аналогичном примере с моделью «Категория» ошибка была выдана при следующих условиях:
1) Оператор require упоминался в двух файлах: ..category.js и ..index.js 2) В первом случае регистр был правильным, во втором файле не было следующего:
category.js
index.js
источник
Определение схемы должно быть уникальным для коллекции, не более одной схемы для коллекции.
источник
потому что ваша схема уже существует, проверьте перед созданием новой схемы.
источник
Вы можете легко решить эту проблему, выполнив
источник
У меня есть ситуация, когда мне нужно динамически создавать модель с каждым запросом, и из-за этого я получил эту ошибку, однако для ее исправления я использовал метод deleteModel, подобный следующему:
Надеюсь, это кому-нибудь поможет.
источник
источник
Для всех, кто заканчивает здесь из-за кодовой базы, состоящей из Typegoose и Mongoose. :
Создайте соединение с БД для каждого из них:
Мангуст:
Typegoose:
источник
Просто у меня ошибка копипаста. В одной строке у меня было то же имя, что и в другой модели (рекламная модель):
Правильно:
Кстати, если у кого-то есть "автосохранение", и используйте индекс для запросов вроде:
Он должен удалить индекс и переписать для правильной модели:
источник
Я решил эту проблему, сделав это
Затем в других файлах
Лучшее решение
Надеюсь, это поможет...
источник
Поскольку эта проблема возникла из-за вызова модели в другой раз. Обойдите эту проблему, заключив код модели в блок try catch. машинописный код выглядит так -
Точно так же вы можете писать код и на js.
источник
Вы используете mongoose.model с тем же именем переменной «user» в check.js и insert.js.
источник
Если вы работаете с expressjs, вам может потребоваться переместить определение модели за пределы app.get (), чтобы оно вызывалось только один раз при создании экземпляра скрипта.
источник