it-swarm.com.de

Mungo-Schema wurde nicht für das Modell registriert

Ich lerne den mittleren Stapel und wenn ich versuche, den Server mit zu starten 

npm start

Ich bekomme eine Ausnahme, die sagt:

schema hasn't been registered for model 'Post'. Use mongoose.model(name, schema)

hier ist mein Code in /models/Posts.js

var mongoose = require('mongoose');

var PostSchema = new mongoose.Schema({
    title: String,
    link: String, 
    upvotes: { type: Number, default: 0 },
    comments: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Comment' }]
});

mongoose.model('Post', PostSchema);

wie ich sehen kann, sollte das Schema für das Modell 'Post' registriert werden. Was kann jedoch dazu führen, dass die Ausnahme ausgelöst wird?

Danke im Voraus.

Bearbeiten: Hier ist der Ausnahmefehler

/home/arash/Documents/projects/personal/flapper-news/node_modules/mongoose/lib/index.js:323
  throw new mongoose.Error.MissingSchemaError(name);
        ^
MissingSchemaError: Schema hasn't been registered for model "Post".
Use mongoose.model(name, schema)

und hier ist der app.js-Code mit der Moose-Initialisierung:

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/news');
require('./models/Posts');
require('./models/Comments');

vor der Zeile:

app.use('/', routes);
49
arash moeen

Beim Modellexport ist das kein Problem. Ich hatte das gleiche Problem. 

Das eigentliche Problem ist, dass Anweisungen für die Modelle erforderlich sind

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/news');
require('./models/Posts');
require('./models/Comments');

waren unter den Routen Abhängigkeiten. Verschieben Sie einfach die MongoDB-Abhängigkeiten über die Routenabhängigkeiten. So sollte es aussehen:

// MongoDB
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/news');
require('./models/Posts');
require('./models/Comments');

var routes = require('./routes/index');
var users = require('./routes/users');

var app = express();
104
user8264

Wenn jemand es nicht mit dem Ansatz der richtigen Antwort beheben konnte (wie ich), versuchen Sie, die Erstellung des Schemas zu überprüfen. Ich habe den 'ref' als 'User' geschrieben, aber der richtige war 'user'.

Falsch:

createdBy: {
    type: Schema.Types.ObjectId,
    ref: 'User'
}

Richtig:

createdBy: {
    type: Schema.Types.ObjectId,
    ref: 'user'
}
16
Rafael Grilli

WENN SIE MEHRERE mongoDB-VERBINDUNGEN VERWENDEN


beachten Sie, dass Sie bei der Verwendung von .populate () das Modell MÜSSEN müssen, da der Mungo nur Modelle auf derselben Verbindung "findet".

var db1 = mongoose.createConnection('mongodb://localhost:27017/gh3639');
var db2 = mongoose.createConnection('mongodb://localhost:27017/gh3639_2');
var userSchema = mongoose.Schema({
  "name": String,
  "email": String
});

var customerSchema = mongoose.Schema({
  "name" : { type: String },
  "email" : [ String ],
  "created_by" : { type: mongoose.Schema.Types.ObjectId, ref: 'users' },
});

var User = db1.model('users', userSchema);
var Customer = db2.model('customers', customerSchema);

Richtig:

Customer.findOne({}).populate('created_by', 'name email', User)

oder

Customer.findOne({}).populate({ path: 'created_by', model: User })

Falsch (erzeugt Fehler "Schema wurde nicht für Modell registriert"):

Customer.findOne({}).populate('created_by');
13
user3616725

Ich habe den folgenden Ansatz verwendet, um das Problem zu lösen

const mongoose = require('mongoose');
const Comment = require('./comment');

const PostSchema = new mongoose.Schema({
            title: String,
            link: String, 
            upvotes: { type: Number, default: 0 },
            comments: [{ type: mongoose.Schema.Types.ObjectId, ref: Comment }]
        });
mongoose.model('Post', PostSchema);

Bitte schauen Sie, hier ref hat nicht string Typwert, jetzt bezieht es sich auf Comment Schema.

4
kuldipem
.\nodeapp\node_modules\mongoose\lib\index.js:452
      throw new mongoose.Error.MissingSchemaError(name);
      ^
MissingSchemaError: Schema hasn't been registered for model "users".
Use mongoose.model(name, schema)
    at new MissingSchemaError

Ich habe diesen Fehler behoben, wenn setTimeout auf server.js verwendet wurde

mongoose.connect(env.get('mongodb.uri'), { useNewUrlParser: true })
  .then(() => logger.info("MongoDB successfully connected"))
  .catch(err => logger.error(err));
app.use(passport.initialize());
setTimeout(function() {
  require("./src/utils/passport")(passport);
}, 3000);
1
Visv M

Dieser Fehler tritt auch auf, wenn wir falsche Referenzen (ref) zwischen Mungomodellen erstellen.

In meinem Fall bezog ich mich auf den Dateinamen anstelle des Modellnamens.

z.B:

const userModel = mongoose.model ("user", userSchema);

Wir sollten uns auf 'Benutzer' (Modellname) anstatt auf 'Benutzer' (Dateiname) beziehen.

1
100RaBH

Sie sollten auch prüfen, ob in Ihrer Datenbank keine fehlerhaften Daten vorhanden sind. Am Ende erhielt ich ein Dokument, das die niedrigere Version des referenzierten Modells enthielt (user statt User). Dies verursacht den Fehler und ist unglaublich schwer zu finden.

Einfach zu beheben mit einer schnellen Mongo-Abfrage:

db.model.updateMany({ approvedByKind: 'user' }, { $set: { approvedByKind: 'User' } })
0
developius

Verweisen Sie auf denselben Namen, auf den Sie sich beim Erstellen eines neuen Modells im Modellnamen beziehen.

Zum Beispiel: wenn ich ein Mungomodell habe wie:

var Post = mongoose.model("post",postSchema);

Dann muss ich mich auf die Postsammlung beziehen, indem ich ref:"post" schreibe.

0
Drumil

In meinem Fall dieses Problem, weil ich das Modell oder das Referenzmodell nicht in die Anwendung aufgenommen habe. Daher sollten Sie Post model und Comment model in Ihrer Knotenanwendung benötigen.

0
Vinh Thai

Ausgehend von Rafael Grillis Antwort oben, 

Richtig:

var HouseSchema = new mongoose.Schema({
  date: {type: Date, default:Date.now},
  floorplan: String,
  name:String,
  house_id:String,
  addressLine1:String,
  addressLine2:String,
  city:String,
  postCode:String,
  _locks:[{type: Schema.Types.ObjectId, ref: 'xxx'}] //ref here refers to the first parameter passed into mongoose.model()
});
var House = mongoose.model('xxx', HouseSchema, 'houseschemas');
0