2017-06-08 60 views
1

我目前正在使用loopback框架的項目。我感到非常沮喪,好像我正在爲這個框架而奮鬥,以完成一些非常簡單的事情。我只需要創建新創建的關聯實例,當接收到一個請求來創建一個包含孩子信息的父實例時。我已經將它工作到了它實際上創建子項的地步,但是當我嘗試設置屬性時,我可以在響應中返回父項和子項......它實際上並未設置子項屬性。這裏發生了什麼??? (編輯我假設模型實例實現setter/getters來防止重寫它設置的一些屬性)使用父模型創建子記錄並返回嵌套在響應中

我找不到任何文檔中有關做這樣簡單的事情。我能找到的最多的是嵌套模型的檢索。當我有一個擁有很多孩子的家長時,如果不發送20個請求,我似乎無法找到任何創建它們的東西。

module.exports = function(Parent) { 
 
    Parent.on('dataSourceAttached',() => { 
 
    const create = Parent.create.bind(Parent); 
 
    Parent.create = async (data, opts) => { 
 
     const { Child } = Parent.app.models; 
 
     let instance; 
 
     try { 
 
     instance = await create(data); 
 
     if (data && data.children && Array.isArray(data.children)) { 
 
      const { id: parentId } = instance; 
 
      const children = await new Promise((resolve, reject) => 
 
      Child.create(
 
       data.children.map(m => Object.assign({}, m, { parentId })), 
 
       opts, 
 
       (err, res) => (err ? reject(err) : resolve(res)) 
 
      ) 
 
     ); 
 
      instance.children = children; 
 
      console.log(instance.children === children); // false (wtf... #@#$#$%) 
 
     } 
 
     return instance; 
 
     } catch (err) { 
 
     // handle err 
 
     } 
 
    }; 
 
    }); 
 
};

回答

0

讓我嘗試用簡單的術語來解釋這個問題。

假設您的父母模型是Library而您的孩子模型是Book。所以現在圖書館有許多圖書和書籍belongsTo圖書館權利。現在

您可以創建LibraryBooks像下面

Library.create({ 
    name: "Library" 
}, function(err, library) { 
    // here library is created 
    // Now if you have set relation, one can create books inside library like below 
    library.books.create(book_array_data, function(err, books) { 
    // here books are created 
    }) 
}) 

在這裏,我提到Library.books其中booksLibrary模型

希望這能解決你的問題關係名。

+1

我的問題是既沒有關係,也沒有實際的子實例的創建。這我可以執行得很好。 家長:'比如=等待創建(數據);' 孩子:'const的孩子=等待新的承諾((解析,拒絕)=>' 我想這樣做是與創建同時返回父我實際上是通過不返回一個模型實例來解決這個問題的(在父類和子類中使用'.toJSON'),我確信它並不理想,我認爲應該有一些方法來使用loopback但是這個 – Goblinlord

+0

是的,我認爲這是唯一的方法,但是如果你願意打另一個電話,也許你會得到想要的結果 – itssajan

+0

是的,我可以使用查詢參數loopback提供另一個調用,但整個問題是不必這樣做。 – Goblinlord

0

我目前通過在所有模型實例上調用toJSON解決此問題,然後根據需要修改它們,然後返回所需的形狀。我希望有一些方法可以在沒有這種類型的情況下使用loopback來做到這一點...但我仍然沒有弄明白。任何進一步的答案仍然非常受歡迎。

module.exports = function(Parent) { 
 
    Parent.on('dataSourceAttached',() => { 
 
    const create = Parent.create.bind(Parent); 
 
    Parent.create = async (data, opts) => { 
 
     const { Child } = Parent.app.models; 
 
     try { 
 
     let children; 
 
     const instance = await create(data); 
 
     if (data && data.children && Array.isArray(data.children)) { 
 
      const { id: parentId } = instance; 
 
      children = await new Promise((resolve, reject) => 
 
      Child.create(
 
       data.children.map(m => Object.assign({}, m, { parentId })), 
 
       opts, 
 
       (err, res) => (err ? reject(err) : resolve(res)) 
 
      ) 
 
     ); 
 
     } 
 
     const resp = Object.assign(instance.toJSON(), {children: children.map(child => child.toJSON()); 
 
     return resp; 
 
     } catch (err) { 
 
     // handle err 
 
     } 
 
    }; 
 
    }); 
 
};

相關問題