为什么我的Mongoose DB模式之一可能是“;强制转换为未定义的“;当它的实例被放置在第二个模式中时

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

本文关键字:模式 实例 第二个 未定义 DB Mongoose 我的 转换 为什么      更新时间:2023-09-26

我创建了一个名为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.

柴达木,谢谢。你建议的解决方案没有奏效,^但通过对它进行一些小的调整,我使它奏效了。我想知道你是否可以建议我的小调整是一个可以接受的解决方案,还是一个令人讨厌的软糖,甚至是第三种选择等等?

^在"var game=new game()"中获取"TypeError:对象不是函数"

调整基本上是为game.js 添加了一个Wrapper模型

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

Game模型传递到父模式定义PlayerSchema,而不是GameSchema模式对象。在您的GameSchema模块应用程序/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(...)
}