Javascript Mongoose for Node.js中带有自定义对象的嵌套模式

Javascript Mongoose for Node.js中带有自定义对象的嵌套模式,javascript,node.js,mongodb,casting,mongoose,Javascript,Node.js,Mongodb,Casting,Mongoose,我一直在尝试将Mongoose用于我的simple Node.js应用程序。我在我的对象中创建了两个自定义对象,它们基本上实现了链表数据结构。我已经成功地保存了对象,但当我试图检索对象并调用我为其定义的一些方法时,问题就出现了。我尝试使用Object.create()作为解决方法,但没有成功。以下是代码失败的地方: UserObj.findOne( { username : username } ).exec( function(err, user) { if(err) {

我一直在尝试将Mongoose用于我的simple Node.js应用程序。我在我的对象中创建了两个自定义对象,它们基本上实现了链表数据结构。我已经成功地保存了对象,但当我试图检索对象并调用我为其定义的一些方法时,问题就出现了。我尝试使用Object.create()作为解决方法,但没有成功。以下是代码失败的地方:

UserObj.findOne( { username : username } ).exec( function(err, user) {
    if(err) {
        res.status(404).json( {success: false, message: "Database error"} );
        return;
    }
    if(user == null) {
        res.status(404).json( {success: false, message: "Username not Registered"} );
        return;
    }
    var sq = Object.create(MusicQueue, user.songQueue); // Not sure if im supposed to pass in MusicQueue or MusicQueue.prototype. Neither work though
    var pl = sq.getPlaylist();
    res.json({
        username : username,
        lastLogin : user.lastLogin,
        playlist : pl
    });
});
下面是我得到的错误:

    var pl = sq.getPlaylist();
                ^
TypeError: Object object has no method 'getPlaylist'
我确实在MusicQueue对象中将该方法定义为原型的一部分(
MusicQueue.prototype.getPlaylist=function(){…};


有什么办法可以解决这个问题吗?有没有一种方法可以将user.songQueue从通用对象强制转换为MusicQueue对象,并能够调用其实例方法?

您的
用户
模式应定义如下:

userSchema.methods.getPlayList = function () {
  // * your function*, might need a callback if async...
};

var User = mongoose.Model('User', userSchema);
var nodeSchema = mongoose.Schema({
    value: String,
    link: { type:  mongoose.Schema.Types.ObjectId, ref: 'Node' }
});

var Node = mongoose.Model('Node', nodeSchema);
您可以使用以下方法添加
静态
方法:

userSchema.statics.getUsersById = function(cb) {
  // * do something, and call cb when done, assuming it's async
};
您不应该使用
prototype
来添加方法。Mongoose将为调用
findOne
的结果创建一个
User
模型的实例,并且
getPlayList
功能(如果如上所示正确定义)将可用(它已添加到原型中)

你在评论中提到了一个链接列表。你可以这样做:

userSchema.methods.getPlayList = function () {
  // * your function*, might need a callback if async...
};

var User = mongoose.Model('User', userSchema);
var nodeSchema = mongoose.Schema({
    value: String,
    link: { type:  mongoose.Schema.Types.ObjectId, ref: 'Node' }
});

var Node = mongoose.Model('Node', nodeSchema);

我通过创建
copy(obj)
方法来解决我的特殊情况,这些方法将获取
findOne(…)
方法返回的对象,并将其中的数据复制到我的对象。由于这个问题,我还遇到了其他问题,但我很确定这些问题与这个问题无关。

您是否记录了sq的值?sq应该是MusicQueue的实例化对象实例(sq=new MusicQueue)@whiteb0x我刚刚将它记录到控制台,它打印的只是一个空对象
{}
@wiredparie我尝试过这样做,但我必须为一个链表节点创建一个模式,该节点有一个值和指向另一个节点的指针。在节点模式中,它需要一个属于另一个节点模式类型的属性(对于下一个节点模式)。这给了我一个错误:
TypeError:schema path的值无效
next``如果需要,您可以只使用type
mongoose.schema.Types.ObjectId而不使用
ref
。但是,它也应该可以工作。我对Mongoose/Node.js/Javascript一般来说都是新手,那么使用
Mongoose.Schema.Types.ObjectId
ref:'Node'
做什么呢?您能否详细介绍一下我如何使用它来建模我的链表数据结构?在MongoDB中,链表可能无法按您所希望的方式工作(因为如果不执行单独的查询,您将无法跟踪一系列节点)。您不需要这样做,而且您正在不必要地复制数据。