我有一个明确的应用程序,我想加载相关和单独的模型,并将它们分别提供给视图。我已正确加载相关的总线,系列和人员模型,但现在还要加载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 :(得分:1)
因此,基于我所看到的,我认为你对承诺缺乏了解。
这部分代码:
bus.findAll({include: [{model: family, include: [person]}]})
.then(buses => buses.map(addCount))
返回解析Promise
数组的busses
。
虽然这部分
volunteerType.findAll()
解析解析为Promise
整个集合的volunteerType
。
执行此操作时:
.then(volunteerTypes => volunteerType.findAll())
你真正做的是busses => busses .findAll()
,因为之前的承诺解析了busses数组。所以这应该返回undefined
结果或抛出错误。
我建议加载volunteerType
模型并将其传递给可以解决两个承诺的函数。
以下是更正后的代码(请注意,我使用Promise.all
同时解决两个不同的承诺,一个是获取公共汽车并改变它们,另一个是抓住志愿者:
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
})
)
};