用于Node.js的Mongoose中具有自定义对象的嵌套模式

时间:2014-01-03 00:36:16

标签: javascript node.js mongodb casting mongoose

我坚持尝试使用Mongoose作为我的简单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对象,并能够调用其实例方法?

2 个答案:

答案 0 :(得分:1)

您的User架构应该像这样定义:

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

var User = mongoose.Model('User', userSchema);

您可以使用以下方法添加static方法:

userSchema.statics.getUsersById = function(cb) {
  // * do something, and call cb when done, assuming it's async
};

您不应使用prototype添加方法。 Mongoose将为调用User的结果创建findOne模型的实例,如果如上所示正确定义,getPlayList函数将可用(它已添加到原型中)

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

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

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

答案 1 :(得分:-1)

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