繁体   English   中英

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

[英]Nested Schemas with Custom Objects in Mongoose for Node.js

我一直试图在我的简单Node.js应用程序中使用Mongoose。 我在对象中创建了几个自定义对象,这些对象基本上实现了链表数据结构。 我已经能够成功保存对象,但是当我尝试检索对象并调用为它定义的某些方法时,问题就来了。 我尝试使用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对象,并能够调用其实例方法?

您的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添加方法。 猫鼬将为调用findOne结果创建User模型的实例,并且getPlayList函数(如上所示正确定义)将可用(它已添加到原型中)。

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

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

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

我只是通过为我的对象创建copy(obj)方法来解决我的特殊情况,该方法将使用findOne(...)方法返回的对象并将其中的数据复制到我的对象中。 因此,我提出了其他问题,但是我很确定它们与该问题无关。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM