I have created a Mongoose DB schema called Game, and a second called Player which contains an array of said Game schema objects. When I run the line player.games = [ game ]; shown in the app.js snippet below, I get the following error:
Cast to undefined failed for value “{ gameID: 551175ee7a81c2c10c000002, points: 10 }” at path “games”
What am I doing wrong, please?
app/models/Game.js (entire file):
var mongoose = require( "mongoose" );
var Schema = mongoose.Schema;
var GameSchema = new Schema({
_id : false,
id : false,
gameID : Schema.ObjectId,
points : Number
});
module.exports = mongoose.model( "Game", GameSchema );
app/models/Player.js (entire file):
var mongoose = require( "mongoose" );
var Game = require( "../models/game" );
var Schema = mongoose.Schema;
var PlayerSchema = new Schema({
socialID : Number,
games : [ Game ]
});
module.exports = mongoose.model( 'Player', PlayerSchema );
app.js (snippet):
router.route( '/players' ).post( function( req, res )
{
var game = new Game();
game.gameID = req.body.gameID;
game.points = req.body.points;
var player = new Player();
player.socialID = req.body.socialID;
player.games = [ game ];
player.save(... etc.
chridam, thank you. The solution you suggested did not work,^ but by making some small adjustments to it I made it work. I wonder whether you could suggest whether my small adjustments are an acceptable solution, or a nasty fudge, or even some third etc. option please?
^ was getting "TypeError: object is not a function" at "var game = new Game()"
The adjustment was basically to add a Wrapper model for game.js
Edited game.js:
var mongoose = require( 'mongoose' );
var Schema = mongoose.Schema;
var Schema = new Schema({
_id : false,
id : false,
gameID : Schema.ObjectId,
points : Number
});
module.exports = mongoose.model( 'Game', Schema );
Additional game_wrapper.js
var Game = require( '../models/game' );
module.exports = Game.Schema;
Edited player.js:
var mongoose = require( 'mongoose' );
var GameWrapper = require( '../models/game_wrapper' );
var Schema = mongoose.Schema;
var Schema = new Schema({
socialID : Number,
games : [ GameWrapper ]
});
module.exports = mongoose.model( 'Player', Schema );
Edited app.js:
var Player = require( './app/models/player' );
var Game = require( './app/models/game' );
router.route( '/players' ).post( function( req, res )
{
var game = new Game({
gameID: req.body.gameID,
points: req.body.points
});
var player = new Player({
socialID: req.body.socialID,
games: [ game ]
});
player.save(...)
}
You are passing a Game model into the parent schema definition PlayerSchema rather than a GameSchema schema object. In your GameSchema module app/models/Game.js, change it to:
var mongoose = require( "mongoose" );
var Schema = mongoose.Schema;
var GameSchema = new Schema({
_id : false,
id : false,
gameID : Schema.ObjectId,
points : Number
});
module.exports = GameSchema;
Then change your PlayerSchema definition to:
var mongoose = require( "mongoose" );
var GameSchema = require( "../models/game" );
var Schema = mongoose.Schema;
var PlayerSchema = new Schema({
socialID: Number,
games: [GameSchema]
});
module.exports = mongoose.model( 'Player', PlayerSchema );
In your route, wrap up your request object into the schema:
router.route( '/players' ).post( function( req, res )
{
var game = new Game({
gameID: req.body.gameID,
points: req.body.points
});
var player = new Player({
socialID: req.body.socialID,
games: [game]
});
player.save(...)
}