Nie wiem, co robię źle, oto mój 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 })
});
a oto mój 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);
});
Za każdym razem, gdy próbuję uruchomić check.js, pojawia się ten błąd
Po skompilowaniu nie można nadpisać modelu „użytkowników” .
Rozumiem, że ten błąd wynika z niedopasowania schematu, ale nie widzę, gdzie to się dzieje? Jestem całkiem nowy w Mongoose i nodeJS.
Oto, co otrzymuję z interfejsu klienta mojej 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
}
>
Odpowiedzi:
Błąd występuje, ponieważ masz już zdefiniowany schemat, a następnie definiujesz go ponownie. Ogólnie rzecz biorąc, powinieneś raz utworzyć wystąpienie schematu, a następnie wywołać go, gdy będzie potrzebny obiekt globalny.
Na przykład:
user_model.js
check.js
insert.js
źródło
ref
s do innych modeli, może to prowadzić do koszmaru zależności. Użyjvar User = mongoose.model('user')
zamiastrequire
.Więc innym powodem, dla którego możesz otrzymać ten błąd, jest użycie tego samego modelu w różnych plikach, ale
require
ścieżka ma inny przypadek. Na przykład w mojej sytuacji miałem:require('./models/User')
w jednym pliku, a następnie w innym, gdzie potrzebowałem dostępu do modelu użytkownika, który miałemrequire('./models/user')
.Wydaje mi się, że wyszukiwanie modułów i mongoose traktuje go jako inny plik. Kiedy upewniłem się, że przypadek pasuje w obu przypadkach, nie było to już problemem.
źródło
Miałem ten problem podczas testów jednostkowych.
Przy pierwszym wywołaniu funkcji tworzenia modelu mongoose przechowuje model pod podanym kluczem (np. „Użytkownicy”). Jeśli wywołasz funkcję tworzenia modelu z tym samym kluczem więcej niż raz, mangusta nie pozwoli Ci nadpisać istniejącego modelu.
Możesz sprawdzić, czy model już istnieje w mangusta za pomocą:
Spowoduje to wyświetlenie błędu, jeśli model nie istnieje, więc możesz zawinąć go w try / catch, aby uzyskać model lub go utworzyć:
źródło
try exports.getModel = ()-> mongoose.model('User', userSchema) catch err exports.getModel = ()-> mongoose.model('User')
Miałem ten problem podczas „oglądania” testów. Po edycji testów zegarek ponownie je przeprowadził, ale z tego właśnie powodu zakończyły się niepowodzeniem.
Naprawiłem to, sprawdzając, czy model istnieje, a następnie użyj go, w przeciwnym razie utwórz.
źródło
module.export = User
sięexport defaults User
. Miałem teżrefs
użytkownika z innych modeli. Nie jestem pewien, dlaczego zmiana zmodule.exports
naexport default
przyniosła ten problem. Niemniej jednak wydaje się, że ta odpowiedź rozwiązała problem.mongoose.models
nie istnieje, przynajmniej w ostatnich wersjachfor (let model in mongoose.models) delete mongoose.models[model]
"test": "NODE_ENV=test mocha --file mocha.config.js --watch"
iw tym pliku config js mambefore()
iafter()
do obsługi konfiguracji i porzucenia. @ E.Sundin zapewnił tutaj idealne rozwiązanie i działa jak urok. Dziękuję Ci!Doświadczałem tego problemu i nie było to spowodowane definicjami schematu, ale raczej bezserwerowym trybem offline - właśnie udało mi się go rozwiązać w ten sposób:
O czym wspomniano tutaj https://github.com/dherault/serverless-offline/issues/258
Mam nadzieję, że pomoże to komuś, kto buduje swój projekt w trybie bezserwerowym i działa w trybie offline.
źródło
module.exports = mongoose.models.Users || mongoose.model('Users', UsersSchema);
Jeśli używasz Serverless w trybie offline i nie chcesz używać
--skipCacheInvalidation
, możesz bardzo dobrze użyć:źródło
--skipCacheInvalidation
Jeśli zrobiłeś to tutaj, możliwe, że miałeś ten sam problem, co ja. Mój problem polegał na tym, że definiowałem inny model o tej samej nazwie . Nazwałem moją galerię i model pliku „Plik”. Cholera, kopiuj i wklejaj!
źródło
Przydarzyło mi się to, kiedy piszę tak:
Jednak prawdziwa ścieżka to „../myUser/User.js”
źródło
Rozwiązałem to, dodając
przed linią:
Mam nadzieję, że to rozwiązuje twój problem
źródło
mongoose.connection.models = {};
Aby rozwiązać ten problem, sprawdź, czy model istnieje przed utworzeniem:
źródło
Wiem, że istnieje akceptowalne rozwiązanie, ale uważam, że obecne rozwiązanie prowadzi do wielu schematów, abyś mógł przetestować modele. Moje rozwiązanie polega w istocie na przeniesieniu modelu i umieszczeniu go wewnątrz funkcji powodującej zwrócenie nowego Modelu, jeśli Model nie został zarejestrowany, ale zwraca istniejący Model, jeśli tak.
Otwieranie i zamykanie połączeń w każdym miejscu jest frustrujące i nie uciska dobrze.
W ten sposób, gdybym wymagał od modelu dwóch różnych miejsc lub dokładniej w moich testach, nie dostałbym błędów i zwracane są wszystkie prawidłowe informacje.
źródło
Ten problem może wystąpić, jeśli zdefiniujesz 2 różne schematy o tej samej nazwie kolekcji
źródło
źródło
Miałem ten sam problem, ponieważ zdefiniowałem schemat i model w funkcji JS, powinny być zdefiniowane globalnie w module węzła, a nie w funkcji.
źródło
Istnieje inny sposób na zgłoszenie tego błędu.
Należy pamiętać, że w ścieżce do modelu rozróżniana jest wielkość liter.
W tym podobnym przykładzie dotyczącym modelu „Kategoria” błąd został zgłoszony w następujących warunkach:
1) Wymagane stwierdzenie pojawiło się w dwóch plikach: ..category.js i ..index.js 2) W pierwszym przypadku sprawa była poprawna, w drugim nie było tak:
category.js
index.js
źródło
Definicja schematu powinna być unikalna dla kolekcji, nie powinna zawierać więcej niż jednego schematu dla kolekcji.
źródło
wynika z tego, że Twój schemat już istnieje, sprawdź poprawność przed utworzeniem nowego schematu.
źródło
Możesz łatwo rozwiązać ten problem, robiąc
źródło
Mam sytuację, w której muszę dynamicznie tworzyć model z każdym żądaniem i przez to otrzymałem ten błąd, jednak to, co naprawiłem, to metoda deleteModel jak poniżej:
Mam nadzieję, że to mogłoby pomóc każdemu.
źródło
źródło
Dla wszystkich osób kończących się tutaj z powodu bazy kodów z mieszanką Typegoose i Mongoose :
Utwórz połączenie db dla każdego z nich:
Mangusta:
Typegoose:
źródło
Po prostu mam błąd wklejania kopii. W jednej linii miałem taką samą nazwę jak w innym modelu (model reklamowy):
Prawidłowe to:
Nawiasem mówiąc, jeśli ktoś ma „automatyczne zapisywanie” i używa indeksu do zapytań takich jak:
Musi usunąć indeks i przepisać na poprawny model:
źródło
Rozwiązałem ten problem, robiąc to
Następnie w innych plikach
Lepsze rozwiązanie
Mam nadzieję, że to pomoże...
źródło
Ponieważ ten problem wystąpił z powodu innego wywołania modelu. Obejdź ten problem, opakowując kod modelu w bloku try catch. kod maszynowy wygląda następująco -
Podobnie możesz pisać kod w js.
źródło
Używasz mongoose.model z tą samą nazwą zmiennej „user” w check.js i insert.js.
źródło
Jeśli pracujesz z expressjs, może być konieczne przeniesienie definicji modelu poza app.get (), aby była wywoływana tylko raz, gdy skrypt jest tworzony.
źródło