【问题标题】:Sending sequelize results through express after forEach loop has run在 forEach 循环运行后通过 express 发送 sequelize 结果
【发布时间】:2018-11-22 02:39:59
【问题描述】:

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

//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);
  });

});

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

我的问题是双重的

第一:

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

第二:

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

【问题讨论】:

  • 在第一个.then() 中,response 来自哪里?
  • models.fas.findAll({

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


【解决方案1】:

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

//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);
  });
});

我需要做一些连接,但我认为这会做:)

【讨论】:

    猜你喜欢
    • 2019-10-06
    • 1970-01-01
    • 2012-11-02
    • 2022-09-27
    • 2018-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多