2015-05-11 52 views
2

我有以下的模型,假設它描述了一本書:Sails.js/waterline:在模型的toJSON函數中執行水線查詢?

module.exports = { 

    attributes: { 
     name: { 
      type: 'String', 
      required: true 
     }, 
     type: { 
      type: 'string', 
      required: true 
     }, 
     book_id: { 
      type: 'integer' 
     } 
    } 
} 

這裏的「類型」屬性是書籍的類型,例如HorrorBook。我有一個單獨的HorrorBooks,FantasyBooks等模型,因爲模型的結構彼此不同,它們有其他領域沒有的領域等,這就是爲什麼我不能只使用一個通用的Book-模型。 HorrorBook,FantasyBook等都有自己的'id'字段,這意味着可以同時存在HorrorBook和FantasyBook。在創建這本書時,我有一個beforeCreate函數,它還根據本書的'type'屬性在HorrorBook或FantasyBook中創建一個條目。

我想要做的是從前端對Book進行查詢時,我想將這本書的相關信息包含在'information'屬性中,例如HorrorBook條目。

toJSON: function() { 
    var obj = this.toObject(); 
    switch (obj.type) { 
     case 'HorrorBook': 
      HorrorBook.find({id: obj.book_id}) 
       .exec(function(err, book_info) { 
        obj.book_info = book_info; 
        return obj; 
       }) 
    } 
} 

但是,這導致toJSON只是返回null。我所假設的是,查詢是異步的,這使得它太慢或者什麼,所以它根本不會進行「返回」調用。那麼我該怎麼做呢?有什麼方法可以在我所嘗試的方法中取得成功,還是應該以某種方式改變我的方法?

回答

1

我所假設的是,查詢是異步的,它使得它太慢或某些東西,所以它根本不會讓它返回'返回'。

發生了什麼事是toJSON()被sync'ed和它的返回無論出來的HorrorBook.find({id: obj.book_id}).exec()undefined聽起來是正確的。

如果需要異步您最好的選擇運行的東西是創建一個異步toJSON()instance method,例如(未測試):

toJSONAsync: function(callback) { 
    var obj = this.toObject(); 
    switch (obj.type) { 
    case 'HorrorBook': 
     HorrorBook.find({id: obj.book_id}) 
      .exec(function(err, book_info) { 
       obj.book_info = book_info; 
       callback (obj); 
      }) 
    } 
} 

現在你可以通過做讓你的結果:

book.toJSONAsync(function(json){ 
    console.log(json); 
}) 
+0

我無法理解在哪裏以及如何使用第二個代碼段。你能詳細說明一下嗎? – Fissio

+0

Fissio,第二個片段用於當前調用'.toJSON()'並獲得'null'的地方。 'book'表示您使用'.find()'從數據庫中檢索到的記錄。 –

+0

啊,我明白了 - 這很遺憾並不能解決我的問題,因爲我從前端發出一個類似'localhost:1337/Book?type = HorrorBook&id = 1'的請求,因此無法執行查詢那裏。對不起,我以前不清楚我的情況。 – Fissio