2017-12-29 35 views
0

관련 모델과 별도 모델을로드하고 별도로보기에 제공하려는 명시적인 애플리케이션이 있습니다. 나는 관련 버스, 가족 및 사람 모델이 올바르게로드되어 있지만 이제는 volunteerTypes을로드하고 별도의 개체로보기에 제공하려고합니다.명시하고 후속편 - 관련없는 모델을 같은 경로에로드하십시오.

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

것은 당신이 공유 할 수 아래

은 수정 코드 (나는, 다른 하나는 자원 봉사자를 잡기 위해 그들을 버스를 얻고 돌연변이, 같은 시간에 하나를 두 가지 약속을 해결하기 위해 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 모델을로드하고 두 가지 약속을 해결할 수있는 함수로 전달하는 것입니다.

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