Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Embedding schemas is giving error

I am trying to embed schemas in other schemas that I have created, and I keep getting this error:

I am not entirely sure what is going wrong here, but what I want to do is store references to my event schema and interests schema inside the user schema. If someone could tell me what I'm doing wrong that would be great thanks!

EDIT: I am now receiving a new error:

   /Users/Dynee/node_modules/mongoose/lib/schema.js:421
  throw new TypeError('Invalid value for schema Array path `' + prefix + key + '`');
  ^

TypeError: Invalid value for schema Array path `eventsHosted`
at Schema.add (/Users/Dynee/node_modules/mongoose/lib/schema.js:421:13)
at new Schema (/Users/Dynee/node_modules/mongoose/lib/schema.js:99:10)
at Object.<anonymous> (/Users/Dynee/Documents/eventure-rest-backend/Models/User.js:5:18)
at Module._compile (module.js:570:32)
at Object.Module._extensions..js (module.js:579:10)
at Module.load (module.js:487:32)
at tryModuleLoad (module.js:446:12)
at Function.Module._load (module.js:438:3)
at Module.require (module.js:497:17)
at require (internal/module.js:20:19)
at Object.<anonymous> (/Users/Dynee/Documents/eventure-rest-backend/Models/Event.js:2:43)
at Module._compile (module.js:570:32)
at Object.Module._extensions..js (module.js:579:10)
at Module.load (module.js:487:32)
at tryModuleLoad (module.js:446:12)
at Function.Module._load (module.js:438:3)

My User Schema

var mongoose = require('mongoose');
var EventSchema = require('../Models/Event').schema;
var InterestSchema = require('../Models/Interest').schema;

var UserSchema = new mongoose.Schema({
    email: String,
    password: String,
    eventsHosted: [EventSchema],
    eventsAttended: [EventSchema],
    currentlyAttending: [EventSchema],
    currentlyHosting: [EventSchema],
    profileImage: String,
    interests: [InterestSchema],
    followers: [UserSchema],
    following: [UserSchema]

});

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

My Event Schema

var mongoose = require('mongoose');
var UserSchema = require('../Models/User').schema;

var EventSchema = new mongoose.Schema({
    title: String,
    description: String,
    location: String,
    attendees: [UserSchema],
    date: String,
});

module.exports = mongoose.model('Event', EventSchema);

My Interests Schema

var mongoose = require('mongoose');

var InterestSchema = new mongoose.Schema({
    name: String
});

module.exports = mongoose.model('Interest', InterestSchema);
like image 687
Lucas Padden Avatar asked Mar 26 '17 02:03

Lucas Padden


1 Answers

It's because what you are exporting in your modules aren't Schemas, they are Models. When you do var EventSchema = require('../Models/Event'); you are requiring the Event Model, not the Event Schema. To access the underlying schemas from your models you can do:

var EventSchema = require('../Models/Event').schema;
var InterestSchema = require('../Models/Interest').schema;
var UserSchema = require('../Models/User').schema;

You also have a problem when you are referencing documents that belongs to another collection, this should work:

Event Model:

var mongoose = require('mongoose');
var UserSchema = require('./User').schema;

var EventSchema = new mongoose.Schema({
    title: String,
    description: String,
    location: String,
    attendees: [{ type: Schema.Types.ObjectId, ref: 'User' }],
    date: String
});

module.exports = mongoose.model('Event', EventSchema);

Interest Model:

var mongoose = require('mongoose');

var InterestSchema = new mongoose.Schema({
    name: String
});

module.exports = mongoose.model('Interest', InterestSchema);

User Model:

var mongoose = require('mongoose');
var EventSchema = require('./Event').schema;
var InterestSchema = require('./Interest').schema;

var UserSchema = new mongoose.Schema({
    email: String,
    password: String,
    eventsHosted: [{ type: Schema.Types.ObjectId, ref: 'Event' }],
    eventsAttended: [{ type: Schema.Types.ObjectId, ref: 'Event' }],
    currentlyAttending: [{ type: Schema.Types.ObjectId, ref: 'Event' }],
    currentlyHosting: [{ type: Schema.Types.ObjectId, ref: 'Event' }],
    profileImage: String,
    interests: [{ type: Schema.Types.ObjectId, ref: 'Interest' }],
    followers: [{ type: Schema.Types.ObjectId, ref: 'User' }],
    following: [{ type: Schema.Types.ObjectId, ref: 'User' }]
});

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

How to reference another schema in my Mongoose schema? http://mongoosejs.com/docs/populate.html

like image 67
luisenrike Avatar answered Oct 17 '22 17:10

luisenrike