[英]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.