2017-10-18 17 views
1

J'ai deux modèles mangouste:Mongoose - MissingSchemaError sur la population

1- modèle de l'événement:

eventSchema = new mongoose.Schema({ 
    name: { 
    type: String, 
    required: true, 
    }, 
    location: { 
    type: { type: String, default: 'Point', required: true }, 
    coordinates: { type: [Number], required: true }, 
    }, 
    sport: { 
    type: mongoose.Schema.Types.ObjectId, 
    ref: 'Sport', 
    required: true, 
    }, 
    startDate: { 
    type: Date, 
    required: true, 
    }, 
    description: { 
    type: String, 
    required: true, 
    }, 
    host: { 
    type: mongoose.Schema.Types.ObjectId, 
    ref: 'User', 
    required: true, 
    }, 
    players: [{ 
    type: mongoose.Schema.Types.ObjectId, 
    ref: 'User', 
    }], 
}, { timestamps: true }); 

2- modèle utilisateur:

userSchema = new mongoose.Schema({ 
    email: { 
    type: String, 
    required: true, 
    unique: true, 
    }, 
    password: { 
    type: String, 
    required: true, 
    }, 
    firstName: { 
    type: String, 
    required: true, 
    }, 
    lastName: { 
    type: String, 
    required: true, 
    }, 
    age: { 
    type: Number, 
    required: true, 
    }, 
    location: { 
    type: String, 
    }, 
}, { timestamps: true }); 

Dans mon EventService je suis en train de recherchez un événement par ID et renvoyez les champs sporthost et players remplis. Les deux premiers champs ne jettent aucune erreur lors du remplissage et fonctionne correctement, mais le problème est avec le champ players. Il jette cette erreur:

{ MissingSchemaError: Schema hasn't been registered for model "players". 
Use mongoose.model(name, schema) 
    at MissingSchemaError (/Users/elias/Documents/tfg/sporter-app/sporter-api/node_modules/mongoose/lib/error/missingSchema.js:20:11) 
    at NativeConnection.Connection.model (/Users/elias/Documents/tfg/sporter-app/sporter-api/node_modules/mongoose/lib/connection.js:1043:11) 
    at getModelsMapForPopulate (/Users/elias/Documents/tfg/sporter-app/sporter-api/node_modules/mongoose/lib/model.js:3569:20) 
    at populate (/Users/elias/Documents/tfg/sporter-app/sporter-api/node_modules/mongoose/lib/model.js:3113:15) 
    at _populate (/Users/elias/Documents/tfg/sporter-app/sporter-api/node_modules/mongoose/lib/model.js:3081:5) 
    at Function.Model.populate (/Users/elias/Documents/tfg/sporter-app/sporter-api/node_modules/mongoose/lib/model.js:3041:5) 
    at Immediate.<anonymous> (/Users/elias/Documents/tfg/sporter-app/sporter-api/node_modules/mongoose/lib/query.js:1441:17) 
    at Immediate.<anonymous> (/Users/elias/Documents/tfg/sporter-app/sporter-api/node_modules/mquery/lib/utils.js:137:16) 
    at runCallback (timers.js:781:20) 
    at tryOnImmediate (timers.js:743:5) 
    at processImmediate [as _immediateCallback] (timers.js:714:5) 
    message: 'Schema hasn\'t been registered for model "players".\nUse mongoose.model(name, schema)', 
    name: 'MissingSchemaError' } 

Enfin voici comment j'appelle la méthode .populate():

const event = await Event.findById(eventId) 
    .populate('sport', 'host', 'players') 
    .exec(); 

Toute idée sur ce que je fais mal? Merci!

Répondre

3

Essayez ceci:

const event = await Event.findById(eventId) 
    .populate('sport') 
    .populate('host') 
    .populate('players') 
    .exec() 

Il y a une section Peupler plusieurs chemins dans les docs ici: http://mongoosejs.com/docs/populate.html

-1

Vous devez faire tous les modèles utilisant mongoose.model ('name', schéma) avant d'essayer de l'utiliser pour peupler car il finira sur mongoose.models key/value ce modèle dont vous avez besoin pour être utilisé lors de l'exécution de remplir pour cette clé.

Donc, chargez les modèles + connectez et ensuite utilisez l'un de ces modèles.