在forEach循环运行后,通过Express发送序列化结果

时间:2018-11-21 17:56:29

标签: javascript node.js express foreach sequelize.js

我在快速路由中运行了一个比较复杂的序列化查询,之后需要运行第二个查询,以将所需的数据附加到返回的结果中:

//Get inboxes based on passed params
router.get('/:data', function(req, res, next) {
  let passedData = JSON.parse(req.params.data);
  models.fas.findAll({
    where: { current_stop: { $like: '%'+passedData.current_stop  +'%'},
             cert_class:   { $like: '%'+passedData.cert_class    +'%'},
             fis_yr:       { $like: '%'+passedData.fis_yr        +'%'},
             work_loc:     { $like: '%'+passedData.work_loc      +'%'},
             action_cd:    { $like: '%'+passedData.action_cd     +'%'},
             form_num:     { $like: '%'+passedData.form_num      +'%'},
             form_id:      'HRTF' },
    include: [
      { model: models.form,         as: 'form'         },
      { model: models.form_status,  as: 'form_status'  },
      { model: models.action_codes, as: 'action_codes' }
    ],
    order: ['form_num']
  }).then(function(response){

    response.forEach( item ) => {
      models.employees.findAll({
        attributes: [ 'fname', 'mname', 'lname' ],
        where: { empl_id: item.form[0].empl_id },
        order: [ 'empl_id' ]
      }).then(function(response){
        item.readableName = response;
      });
    });

  }).then(function(response){
    res.send(response);
  }).catch(function(error) {
    return next(error);
  });

});

在这里(当前设置)存在的问题是,在调用res.send(response)之前,我需要forEach完成附加数据。如果我从该代码中删除最后一个.then()并将res.send与循环放在同一块中,则其余数据将正确发送,但employees表中未显示任何结果。但是,使用上面设置的方法,没有任何内容发送到我尝试发送的响应对象。

我的问题是双重的

第一

employees表没有任何与原始表(fas)匹配的列。因此,据我了解,我无法在两者之间建立关联(这将消除对forEach的需求)。是真的吗?

第二:

如果循环是执行此操作的正确方法,我如何将结果从forEach返回到下一个.then,然后使用res.send()将其发送?

1 个答案:

答案 0 :(得分:0)

嗯,像往常一样,我在发布此消息后不久想到了一个解决方案。事实证明,您可以在Sequelize中使用嵌套包含,并且在employee表和我已经在使用的另一个表之间有一个关联。解决方案如下:

//Get inboxes based on passed params
router.get('/:data', function(req, res, next) {

  let passedData = JSON.parse(req.params.data);
  models.hrtf_fas.findAll({
    where: { current_stop: { $like: '%'+passedData.current_stop  +'%'},
             cert_class:   { $like: '%'+passedData.cert_class    +'%'},
             fis_yr:       { $like: '%'+passedData.fis_yr        +'%'},
             work_loc:     { $like: '%'+passedData.work_loc      +'%'},
             action_cd:    { $like: '%'+passedData.action_cd     +'%'},
             form_num:     { $like: '%'+passedData.form_num      +'%'},
             form_id:      'HRTF'
    },
    include: [
      { model: models.form,         as: 'form',
        include: [{
          model: models.employees,  as: 'employees',
          attributes: [ 'fname', 'lname' ]
        }]        
      },
      { model: models.form_status,  as: 'form_status'  },
      { model: models.action_codes, as: 'action_codes' }
    ],
    order: ['form_num']
  }).then(function(response){
    res.send(response);
  }).catch(function(error) {
    return next(error);
  });
});

我需要做一些concat,但是我认为这会做的:)