簡體   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