当我的一个 Mongoose DB 模式的实例被放置在第二个模式中时,为什么它可能是 "cast to undefined"?

Why might one of my Mongoose DB schemas be being "cast to undefined" when instances of it are placed in a second schema?

我已经创建了一个名为 Game 的 Mongoose DB 模式,以及一个名为 Player 的第二个模式,其中包含一组所述 Game 模式对象。当我 运行 行 player.games = [ game ]; 显示在下面的 app.js 片段中时,我收到以下错误:

Cast to undefined failed for value “{ gameID: 551175ee7a81c2c10c000002, points: 10 }” at path “games”

请问我做错了什么?

app/models/Game.js(整个文件):

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(整个文件):

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(片段):

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.

您正在将 Game 模型传递到父架构定义 PlayerSchema 而不是 GameSchema 架构对象。在您的 GameSchema 模块 app/models/Game.js 中,将其更改为:

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

var GameSchema = new Schema({
    _id :    false,
    id :     false,
    gameID : Schema.ObjectId,
    points : Number
});

module.exports = GameSchema;

然后将您的 PlayerSchema 定义更改为:

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

在您的路线中,将您的请求对象包装到模式中:

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(...)
}

chridam,谢谢。您建议的解决方案不起作用,^ 但通过对其进行一些小的调整,我让它起作用了。我想知道你是否可以建议我的小调整是否是一个可以接受的解决方案,或者是一个令人讨厌的软糖,或者甚至是第三个等等选项?

^ 在 "var game = new Game()"

得到 "TypeError: object is not a function"

调整主要是为 game.js

添加 Wrapper 模型

已编辑 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 );

额外game_wrapper.js

var Game = require( '../models/game' );
module.exports = Game.Schema;

已编辑 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 );

已编辑 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(...)
}