webentwicklung-frage-antwort-db.com.de

MissingSchemaError: Schema wurde für das Modell "Benutzer" nicht registriert

In meiner models/user.js-Datei:

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var userSchema = new Schema({
    (define schema)
});
...
(save user)
...
(check password)
...
mongoose.model('User', userSchema);

Und in meinem router/index.js habe ich:

var mongoose = require('mongoose');
var User = mongoose.model('User');

was wirft den Fehler:

MissingSchemaError: Schema hasn't been registered for model "User".

Wenn jedoch in user.js, mache ich (in der letzten Zeile)

module.exports = mongoose.model('User', userSchema);

und in index.js mache ich var User = require('../models/User');, dann funktioniert alles.

Aber es sollte nicht sein, denn in config/pass.js mache ich var User = mongoose.model('User'); und es funktioniert einwandfrei.

Die require('../models/User');-Syntax funktioniert nicht auf Ubuntu, sondern auf meinem Mac.

Was soll ich machen? Wie kann ich das beheben? Ich habe mir Tonnen von Beispiel-Apps angesehen, darunter MEAN , aber nichts war wirklich hilfreich.

36
Karan Goel

Ich habe das gleiche Problem, wenn ich das MEAN-Tutorial ausprobiere. 

Nachdem ich ein wenig recherchiert hatte, fand ich heraus, dass in app.js, wenn var (= ./ models/User) vor var routes = ("./routes/index") gesetzt wird, es funktioniert. 

So was:


mongoose.connect("mongodb://localhost/news");
require("./models/Posts");
require("./models/Comments");

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

var app = express();

Hoffe die Antwort wird hilfreich sein!

48
Ahei Cheng

Der Fehler tritt auf, weil der models/user.js zum Zeitpunkt, zu dem router/index.js geladen wurde, nicht interpretiert wurde. Eine Möglichkeit, dies zu lösen, besteht darin, Folgendes zu tun:

var mongoose = require('mongoose');
//Load all your models
var User = require('./../models/user.js');

//Now, this call won't fail because User has been added as a schema.
mongoose.model('User');

Dies ist jedoch gegen Best Practices verstoßen, die besagen, dass all diese Konfigurationssachen zu Beginn Ihrer app.js-Datei vorkommen sollten. Schauen Sie sich dieses Beispiel aus dem Beispielprojekt madhums an

var models_path = __dirname + '/app/models'
fs.readdirSync(models_path).forEach(function (file) {
  if (~file.indexOf('.js')) require(models_path + '/' + file)
})

Beachten Sie, dass er seine Modelle lädt, bevor Sie den Router der App einstellen. Was Ubuntu vs Mac betrifft, glaube ich, dass ein relativer Pfad in Ubuntu mit ./ beginnen muss. Sie müssen es nur in ./../models/user.js ändern, was auf Mac funktioniert.

34
verybadalloc

Der gesamte Code in Ihren joose-Dateien für das Moose-Schema sollte ausgeführt werden, bevor er in anderen Dateien verwendet wird.

Das folgende Codeausschnitt stellt beispielsweise sicher, dass die Moose-Schema-Dateien/-Module ausgeführt werden.

fs.readdirSync (__ dirname + '/app/models').forEach( function (file) { if (~ file.indexOf ('. js ')) erfordert (__ dirname +'/app/models/'+ };});

oder Schemadateien können manuell durch Aufruf ausgeführt werden 

var User = required ('./app/models/user.js')

bevor die Modelle irgendwo in der Anwendung verwendet werden.

Sobald dies geschehen ist, können andere Module, die Mungo-Modelle verwenden, benötigt werden/ausgeführt werden.

9

Dieses Problem trat auf, wenn versucht wurde, ein Modell abzurufen, bevor die Modelldatei geladen wurde

Ich habe dasselbe Problem in meinem mean.io - Projekt gelöst

Im Controller:

'use strict';
require('../models/settingsModel'); // load settingsModel.js file before get mongoose.model('Settings')
var mongoose = require('mongoose'),
    Settings = mongoose.model('Settings'),
    Q = require('q');
6
Shaishab Roy

Bei der Verwendung von Express besteht ein häufiger Fehler darin, den Express vor dem Mungo zu fordern. Dies führt zu "MissingSchemaError: Schema wurde nicht für das Modell" Benutzer "registriert." Error.

Sie können das Problem leicht korrigieren, indem Sie die Reihenfolge der "Requests" korrigieren (d.

var mongoose = require('./config/mongoose'), 
    express = require('./config/express');
2
Wreeecks

Ich habe diese Fehlermeldung erhalten, als ich mongoose-fixture verwendete, um einige Standarddaten in eine Mongo-Sammlung zu samen. War lange Zeit ratlos, folgte diesem und ähnlichen Threads um Hilfe und versuchte zu debuggen. Letztendlich stellte sich heraus, dass es sich bei mir um mongoose- und mongoose-fixture-Versionen handelte. 

Wenn kein Code geändert wird, oder wenn Sie diese Fehlermeldung erhalten, während Sie versuchen, mongoose-fixture (der Ihre Schemas für Sie registrieren soll) korrekt zu verwenden, versuchen Sie dies. Löschen Sie das node_modules-Verzeichnis Ihres Projekts, führen Sie einen npm cache clean und dann einen npm install aus. 

Wenn auch dies nicht hilft, vergleichen Sie die Versionen von mongoose/mongoose-fixture zwischen der problematischen und der funktionierenden App, und ändern Sie die Version in Ihrem package.json. Wiederholen Sie die obigen Schritte. Das hat bei mir funktioniert.

1
Avik Ray

Dieses Problem ist aufgetreten, als versucht wurde, ein neues Modell im Basiscode dieses Lernprogramms hinzuzufügen User Auth auf MEAN-Stack . Die Lösung ist wie das, was Ahei erwähnt wurde.

Insbesondere muss ich am Ende von /app_api/models/db.js eine Zeile require('path/to/your/model') hinzufügen, die in app.js erforderlich ist. Es ist besser, die Konsistenz der Struktur beizubehalten, um die Entwicklung zu erleichtern.

0
peteroid

Ich habe einen anderen Fehler gemacht, als ich das Auflistungsschema und sein Modell korrekt erstellt habe, aber das Problem war, dass ich das Schemamodell nicht verwendet habe (zum Einfügen, Aktualisieren, Lesen und Löschen des Dokuments).

d.h. ich habe die Sammlung in etwa so erstellt:

const playerSchema = new Schema({
    bowling: {
        style: String,
        arm: String,
    }
})

export const PlayerSchema = model('Player', playerSchema)

habe aber PlayerSchema model nicht verwendet oder aufgerufen, deshalb wird dieser Fehler angezeigt

0
WasiF

Ich habe kürzlich eine Lösung gefunden, die den Antworten von @ rajkumar-nagarajan und @verybadalloc ähnelt.

Dieser Ansatz gefällt mir besser, da er die n + 1-Iteration vermeidet und nicht alle Modelle aus dem Dateisystem liest.

In app/models/index.js benötigen Sie jede Modelldatei:

require('./model1');
require('./model2');
require('./model3');

In /app.js oder /index.js (je nachdem, was Ihr Projekt verwendet) können Sie jetzt einfach Folgendes tun:

require('./app/models');

Der Teil, den ich vermisse (alle Tipps, die hier geschätzt werden) - So registrieren Sie jedes Modell einfach mit Namen wie:

mongoose.model('Model1')
0
theUtherSide
  • Sie müssen Ihr Modell in Ihrem Code angeben
  • Mongoose erkennt erst, wenn Sie mongoose.model aufgerufen haben, dass Sie ein Modell definiert haben, und das wird nur aufgerufen, wenn Sie model benötigen

Ex.

Im folgenden Beispiel erhalten Sie MissingSchemaError: Schema hasn't been registered for model “Role”, Wenn Sie const Role = require("./role"); nicht ausführen.

const mongoose = require("mongoose");
const Schema = mongoose.Schema;
const Role = require("./role");
const userSchema = new Schema(
  {
    role: { type: Schema.Types.ObjectId, ref: "Role", required: false },
    username: { type: String, required: true, trim: true },
    password: { type: String, required: true, trim: true },
    email: { type: String, required: true, trim: true }
  },
  { timestamps: true }
);

module.exports = mongoose.model("User", userSchema);
0
Vaibhav Bacchav

Ich habe diesen Fehler auch mit ES6/TypeScript erlebt. Auch wenn ich das Modell importierte, blieb der Fehler bestehen. Nach den Dokumenten hier

MongooseError.MissingSchemaError

Wird ausgelöst, wenn Sie versuchen, auf ein Modell zuzugreifen, das noch nicht registriert wurde

    import { model, Schema } from 'mongoose';
    import Company from './CompanyModel';

    const ProjectSchema = new Schema({
        company: { type: Schema.Types.ObjectId, ref: "Company" }
    });

    export default model('Project', ProjectSchema);

Die Tipps sollten nur sicherstellen, dass Sie das Modell explizit verwenden, sodass das Ändern von ref:"Company" in ref:Company.modelName das Problem behoben hat.

Ich hoffe das hilft einigen von euch

0
irzhy