表达和续集 - 在同一路线中加载不相关的模型

问题描述 投票:0回答:1

我有一个明确的应用程序,我想加载相关和单独的模型,并分别提供给视图。我已正确加载相关的总线,系列和人员模型,但现在还要加载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;
};
javascript node.js express sequelize.js
1个回答
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的函数。

下面是更正的代码(请注意,我使用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
        })
    )
};
© www.soinside.com 2019 - 2024. All rights reserved.