2017-12-29 42 views
0

私は関連するモデルと別個のモデルをロードして別々にビューに提供したいという明示的なアプリケーションを持っています。私は、関連するバス、家族、人物のモデルが正しく読み込まれているが、現在はvolunteerTypesをロードして別のオブジェクトとしてビューに供給したい。ExpressとSequelize - 無関係なモデルを同じルートにロードする

exports.get = (request, response) => { 
    bus.findAll({include: [{model: family, include: [person]}]}) 
     .then(buses => buses.map(addCount)) 
     .then(volunteerTypes => volunteerType.findAll()) 
     .then((buses, volunteerTypes) => response.render('pages/register', {buses: buses, volunteerTypes: volunteerTypes})); 
}; 

私は、しかし、私はこのための適切な構文を決定することができていない、これはシンプルであるべきだと思います。 sequelize docsには熱心な読み込みを使用して関連するデータを読み込む例がたくさんありますが、別々のモデルを読み込む方法を示す例があります。 FWIWの場合、ノード・コンソールの出力は、volunteerTypeモデルに対する別の照会が実行されていることを示します。これは、ビューに渡すことができるように、このクエリの結果を適切に格納するという問題になるかもしれません。

更新:addCountは、単にバス配列内の各バスにプロパティを追加しています。私はそれが私の質問に関連していると思いますが、ここで要求されるようにコードされていない:

const atCampPeople = thisFamily => thisFamily.dataValues.people.filter(pers => pers.isAtCampPerson).length; 
const countPeople = (count, thisFamily) => count + atCampPeople(thisFamily); 

const addCount = thisBus => { 
    thisBus.dataValues.count = thisBus.dataValues.families.reduce(countPeople, 0); 
    return thisBus.dataValues; 
}; 
+0

あなたが共有することができます。以下は

は修正されたコード(ボランティアをつかむために、他の、1はバスを取得し、それらを変異させる、私は同時に2つの異なる約束を解決するためにPromise.allを使用していますので注意です'addCount'の内容は、そうでなければこれを理解するのが難しいです – asosnovsky

+1

@asosnovskyは要求通りにコードを追加しました – dtburgess

答えて

1

だから私が見たものに基づいて、私はあなたが約束のいくつかの理解を欠いていることだと思います。

コードのこの部分:

bus.findAll({include: [{model: family, include: [person]}]}) 
     .then(buses => buses.map(addCount)) 
busses配列を解決 Promiseを返し

この部分

volunteerType.findAll() 

volunteerTypeのコレクション全体に解決Promiseを解決しながら。

あなたが行う場合は、この:前からの約束は、バスの配列を解決するために何が本当にやっていることは、busses => busses .findAll()ある

.then(volunteerTypes => volunteerType.findAll()) 

。したがって、これはundefined結果を返すか、エラーをスローする必要があります。

私が提案しているのは、volunteerTypeモデルをロードし、2つの約束を解決できる関数に渡すことです。

exports.get = (request, response) => { 
    return Promise.all([ 
     // Grab and mutate busses 
     bus.findAll({ 
      include: [{ 
       model: family, include: [person] 
      }] 
     }). 
     then(buses => buses.map(addCount)), 
     // grab volunteerType 
     volunteerType.findAll() 
    ]). 
    // This now returns an Array with the resolution of each promise 
    then(([busses, volunteerType]) => 
     response.render('pages/register', { 
      buses, 
      volunteerTypes 
     }) 
    ) 
}; 
+1

これはまさに私が望んでいた答えでした - 私の理解のギャップがどこにあるのかの説明 – dtburgess

+0

問題ありません!お力になれて、嬉しいです! – asosnovsky

関連する問題