2017-06-08 1 views
1

私は現在、loopbackフレームワークを使用しているプロジェクトに取り組んでいます。まるで私がこのフレームワークと戦って、非常に簡単なことをするように感じているのは、非常にイライラしています。子インスタンスの情報を持つ親インスタンスを作成するリクエストを受け取ったときに、新しく作成された関連インスタンスを作成するだけで済みます。私はそれが実際に子どもを作成するところまで働いていますが、私はそのプロパティを設定しようとすると、応答の親と子の両方を返すことができます...実際に子供のプロパティを設定しません。ここで何が起こっているのですか? (editモデルインスタンスがsetter/getterを実装して、それが設定するプロパティの一部をオーバーライドしないと仮定します)親モデルを持つ子レコードを作成し、応答でネストされた戻り値

このような単純なことについては、ドキュメントに何も見つかりません。私が見つけることができる最も多くは、ネストされたモデルの取得です。私は多くの子供がいる親を持つときに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図書館が持っています。 booksLibraryモデル

・ホープこれはあなたの問題を解決における関係名がどこにある

今、あなたはここで私はLibrary.booksを言及した以下の

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 
    }) 
}) 

ようLibraryBooksを作成することができます。

+1

私の問題は関係でも、実際の子インスタンスの作成でもありません。これは私がうまくいくことができます。 親: 'インスタンス=(データ)を作成待つ;' 子供を:= 'constの子供を新しい約束を待つ((解決、拒否)=>' 私は何をしたいが作成した親の両方を返しています私は実際にモデルインスタンスを返さない(親と子に '.toJSON'を使って)これを解決しました。私はそれが理想的ではないと確信しています、そして、私はループバックを使ってこれを行ういくつかの方法があると仮定しますしかし、これは – Goblinlord

+0

はい、私はこれが唯一の方法だと思いますが、別の呼び出しをしたいなら、多分望みの結果を得るでしょう。 – itssajan

+0

はい、ループバックが提供するクエリパラメータで別の呼び出しを行うことができます。それをする必要はありません。 – Goblinlord

0

私は現在、すべてのモデルインスタンスでtoJSONを呼び出し、必要に応じて変更してから、必要なシェイプを返すようにしました。私は、このタイプのものがなければループバックを使用してこれを行うには何らかの方法が必要だと思っています...しかし、私はまだそれを把握していません。それ以上の答えはまだ大歓迎です。

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 
 
     } 
 
    }; 
 
    }); 
 
};

関連する問題