Nicht sicher, was ich falsch mache, hier ist meine 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 })
});
und hier ist meine 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);
});
Immer wenn ich versuche, check.js auszuführen, wird dieser Fehler angezeigt
Das einmal kompilierte Benutzermodell kann nicht überschrieben werden .
Ich verstehe, dass dieser Fehler auf eine Nichtübereinstimmung des Schemas zurückzuführen ist, aber ich kann nicht sehen, wo dies geschieht. Ich bin ziemlich neu in Mungo und NodeJS.
Folgendes erhalte ich von der Client-Oberfläche meiner 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
}
>
Antworten:
Der Fehler tritt auf, weil Sie bereits ein Schema definiert haben und das Schema dann erneut definieren. Im Allgemeinen sollten Sie das Schema einmal instanziieren und dann von einem globalen Objekt aufrufen lassen, wenn es benötigt wird.
Beispielsweise:
user_model.js
check.js
insert.js
quelle
ref
für andere Modelle haben, kann dies zu einem Albtraum der Abhängigkeit führen. Verwenden Sievar User = mongoose.model('user')
anstelle vonrequire
.Ein weiterer Grund, warum dieser Fehler auftreten kann, ist, dass Sie dasselbe Modell in verschiedenen Dateien verwenden, Ihr
require
Pfad jedoch einen anderen Fall hat. Zum Beispiel hatte ich in meiner Situation:require('./models/User')
in einer Datei und dann in einer anderen Datei, in der ich Zugriff auf das Benutzermodell benötigte, das ich hatterequire('./models/user')
.Ich denke, die Suche nach Modulen und Mungos behandelt es als eine andere Datei. Nachdem ich sichergestellt hatte, dass der Fall in beiden Fällen übereinstimmte, war dies kein Problem mehr.
quelle
Ich hatte dieses Problem beim Unit-Test.
Wenn Sie die Modellerstellungsfunktion zum ersten Mal aufrufen, speichert Mungo das Modell unter dem von Ihnen angegebenen Schlüssel (z. B. "Benutzer"). Wenn Sie die Modellerstellungsfunktion mehrmals mit demselben Schlüssel aufrufen, können Sie mit Mungo das vorhandene Modell nicht überschreiben.
Sie können überprüfen, ob das Modell bereits im Mungo vorhanden ist mit:
Dies löst einen Fehler aus, wenn das Modell nicht vorhanden ist. Sie können es also in einen Versuch / Fang einschließen, um entweder das Modell abzurufen oder es zu erstellen:
quelle
try exports.getModel = ()-> mongoose.model('User', userSchema) catch err exports.getModel = ()-> mongoose.model('User')
Ich hatte dieses Problem beim "Anschauen" von Tests. Als die Tests bearbeitet wurden, führte die Uhr die Tests erneut aus, sie schlugen jedoch aus genau diesem Grund fehl.
Ich habe es behoben, indem ich überprüft habe, ob das Modell vorhanden ist, und es dann verwendet habe, sonst habe ich es erstellt.
quelle
module.export = User
zuexport defaults User
. Ich mussterefs
auch User von anderen Modellen. Ich bin mir nicht sicher, warum der Wechsel vonmodule.exports
zuexport default
dieses Problem gebracht hat. Trotzdem scheint diese Antwort es behoben zu haben.mongoose.models
existiert nicht, zumindest in neueren Versionenfor (let model in mongoose.models) delete mongoose.models[model]
"test": "NODE_ENV=test mocha --file mocha.config.js --watch"
Testskript sieht so aus: und in dieser Konfigurations-JS-Datei habe ich einbefore()
undafter()
, um Setup und Teardown zu handhaben. @ E.Sundin bot hier die perfekte Lösung, und es funktioniert wie ein Zauber. Danke dir!Ich habe dieses Problem festgestellt und es lag nicht an den Schemadefinitionen, sondern am serverlosen Offline-Modus. Ich habe es nur so gelöst:
Was hier erwähnt wird https://github.com/dherault/serverless-offline/issues/258
Hoffentlich hilft das jemand anderem, der sein Projekt im Serverless-Modus erstellt und den Offline-Modus ausführt.
quelle
module.exports = mongoose.models.Users || mongoose.model('Users', UsersSchema);
Wenn Sie Serverless offline verwenden und nicht verwenden möchten
--skipCacheInvalidation
, können Sie Folgendes verwenden:quelle
--skipCacheInvalidation
Wenn Sie es hier geschafft haben, ist es möglich, dass Sie das gleiche Problem hatten, das ich hatte. Mein Problem war, dass ich ein anderes Modell mit dem gleichen Namen definierte . Ich habe meine Galerie und mein Dateimodell "Datei" genannt. Verdammt, du kopierst und fügst ein!
quelle
Das ist mir passiert, wenn ich so schreibe:
Der wahre Pfad lautet jedoch '../myUser/User.js'.
quelle
Ich habe dies durch Hinzufügen gelöst
vor der Zeile:
Hoffe, es löst Ihr Problem
quelle
mongoose.connection.models = {};
So lösen Sie dieses Problem: Überprüfen Sie, ob das Modell vor der Erstellung vorhanden ist:
quelle
Ich weiß, dass es eine akzeptierte Lösung gibt, aber ich bin der Meinung, dass die aktuelle Lösung zu einer Menge Boilerplate führt, nur damit Sie Modelle testen können. Meine Lösung besteht im Wesentlichen darin, Ihr Modell in eine Funktion zu platzieren, die zur Rückgabe des neuen Modells führt, wenn das Modell nicht registriert wurde, aber das vorhandene Modell zurückgibt, wenn dies der Fall ist.
Das Öffnen und Schließen von Verbindungen überall ist frustrierend und lässt sich nicht gut komprimieren.
Auf diese Weise würde ich keine Fehler erhalten, wenn ich das Modell an zwei verschiedenen Stellen oder genauer in meinen Tests benötigen würde, und alle korrekten Informationen werden zurückgegeben.
quelle
Dieses Problem kann auftreten, wenn Sie zwei verschiedene Schemas mit demselben Sammlungsnamen definieren
quelle
quelle
Ich hatte das gleiche Problem. Grund dafür war, dass ich ein Schema für ein Modell in einer JS-Funktion definiert habe. Sie sollten global in einem Knotenmodul und nicht in einer Funktion definiert werden.
quelle
Es gibt eine andere Möglichkeit, diesen Fehler auszulösen.
Beachten Sie, dass beim Pfad zum Modell zwischen Groß- und Kleinschreibung unterschieden wird.
In diesem ähnlichen Beispiel mit dem Modell "Kategorie" wurde der Fehler unter folgenden Bedingungen ausgelöst:
1) Die require-Anweisung wurde in zwei Dateien erwähnt: ..category.js und ..index.js 2) In der ersten war der Fall korrekt, in der zweiten Datei war es nicht wie folgt:
category.js
index.js
quelle
Die Schemadefinition sollte für eine Sammlung eindeutig sein. Sie sollte nicht mehr als ein Schema für eine Sammlung sein.
quelle
Weil Ihr Schema bereits vorhanden ist, überprüfen Sie es, bevor Sie ein neues Schema erstellen.
quelle
Sie können dies leicht lösen, indem Sie dies tun
quelle
Ich habe eine Situation, in der ich das Modell bei jeder Anforderung dynamisch erstellen muss, und aus diesem Grund habe ich diesen Fehler erhalten. Um ihn zu beheben, habe ich jedoch die Methode deleteModel wie die folgende verwendet:
Ich hoffe das konnte jedem helfen.
quelle
quelle
Für alle Leute, die wegen einer Codebasis mit einer Mischung aus Typegoose und Mongoose hier enden :
Erstellen Sie für jede eine Datenbankverbindung:
Mungo:
Tippfehler:
quelle
Ich habe nur eine fehlerhafte Kopie eingefügt. In einer Zeile hatte ich den gleichen Namen wie in einem anderen Modell (Anzeigenmodell):
Richtig ist:
Übrigens, wenn jemand "automatisch speichern" hat und Index für Abfragen verwendet wie:
Es muss den Index löschen und für das richtige Modell neu schreiben:
quelle
Ich habe dieses Problem dadurch gelöst
Dann in anderen Dateien
Bessere Lösung
Ich hoffe das hilft...
quelle
Da dieses Problem aufgetreten ist, weil das Modell ein anderes Mal aufgerufen wurde. Umgehen Sie dieses Problem, indem Sie Ihren Modellcode in den try catch-Block einschließen. Typoskript-Code ist wie folgt:
Ebenso können Sie auch Code in js schreiben.
quelle
Sie verwenden mongoose.model mit demselben Variablennamen "user" in check.js und insert.js.
quelle
Wenn Sie mit expressjs arbeiten, müssen Sie Ihre Modelldefinition möglicherweise außerhalb von app.get () verschieben, damit sie nur einmal aufgerufen wird, wenn das Skript instanziiert wird.
quelle