web-dev-qa-db-fra.com

Mongoose Schema n'a pas été enregistré pour le modèle

J'apprends la pile moyenne et quand j'essaie de démarrer le serveur en utilisant 

npm start

Je reçois une exception disant que:

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

voici mon code dans /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);

comme je peux le voir, le schéma devrait être enregistré pour le modèle 'Post', mais qu'est-ce qui peut éventuellement provoquer la levée de l'exception?

Merci d'avance.

Modifier: Voici l'erreur d'exception

/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)

et voici le code app.js avec l'initialisation mangouste:

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

avant la ligne:

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

Ce n'est pas un problème avec l'exportation de modèle. J'ai eu le même problème. 

Le vrai problème est qu'il faut des déclarations pour les modèles

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

étaient en dessous des dépendances des routes. Il suffit de déplacer les dépendances mongoDB au-dessus des dépendances des routes. Voici à quoi cela devrait ressembler:

// 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

Si quelqu'un ne peut pas résoudre le problème avec l'approche de la bonne réponse (comme moi), essayez de regarder la création du schéma. J'ai écrit le 'ref' en tant que 'User', mais le correct était 'user'.

Faux:

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

Correct:

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

SI VOUS UTILISEZ PLUSIEURS CONNEXIONS mongoDB


attention, lorsque vous utilisez .populate (), vous DEVEZ fournir le modèle, car mangouste ne "trouvera" que des modèles sur la même connexion .

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);

Correct:

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

ou

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

Incorrect (produit l'erreur "Le schéma n'a pas été enregistré pour le modèle"):

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

J'ai utilisé l'approche suivante pour résoudre le problème

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);

Veuillez regarder, ici ref n'a pas de valeur de type string, maintenant il fait référence au schéma Comment.

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

J'ai eu cette erreur résolue lorsque j'utilise setTimeout sur server.js

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

Cette erreur apparaît également lorsque nous créons de mauvaises références (ref) entre les modèles mangouste.

Dans mon cas, je parlais du nom du fichier au lieu du nom du modèle.

par exemple:

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

Nous devrions faire référence à "utilisateur" (nom du modèle) au lieu de "utilisateur" (nom de fichier);

1
100RaBH

Vous devez également vérifier que votre base de données ne contient pas de données altérées. Je me suis retrouvé avec un document contenant la version minuscule du modèle référencé (user au lieu de User). Cela provoque l'erreur et est incroyablement difficile à détecter.

Facile à résoudre avec une requête rapide mongo:

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

Référez-vous au même nom que celui que vous utilisez dans le nom du modèle lors de la création d'un nouveau modèle.

Par exemple: si j'ai un modèle de mangouste comme:

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

Ensuite, je dois faire référence à la collection d'articles en écrivant ref:"post".

0
Drumil

Dans mon cas, ce problème, car je n’ai pas inclus le modèle ou le modèle de référence dans l’application . Vous devez donc obligatoirement utiliser Post model et Comment model dans votre application de noeud.

0
Vinh Thai

Expliquant la réponse de Rafael Grilli ci-dessus, 

Correct:

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
Russell Elfenbein