knex 两个 mysql 查询使用 promise 同步

knex two mysql query synchronize using promise

Promise.all(sendData.franchisee.map(row => {

    return  knex('designer.settings').select('value').where({setting_key : 'PRICING_TIER'})
            .then(pricing_tier => {

                row.pricing_tier = pricing_tier[0].value;

                knex('designer.pricing_tier').select('tier_title').where({id : row.pricing_tier})
                .then(tier_title =>{

                    row.tier_title = tier_title[0].tier_title;
                    return row;
                })

            });

})).then(response => {
    cb(sendData);     
});

听到它在 'designer.settings' 和 'designer.pricing_tier' 中的两个查询。 当执行 'designer.settings' 时,我在执行 'designer.pricing_tier' 后在行中得到了结果,但输出没有在行中。 row.tier_title = tier_title[0].tier_title 不在最终发送数据中。 如何在一个承诺中同步两个查询?

您应该将这两个查询包装到一个承诺中,该承诺仅在两个查询都完成工作时才解析,如下所示:

Promise.all(sendData.franchisee.map(row => {

  return  new Promise((resolve) => {
    knex('designer.settings').select('value').where({setting_key : 'PRICING_TIER'})
      .then(pricing_tier => {

        row.pricing_tier = pricing_tier[0].value;

        knex('designer.pricing_tier').select('tier_title').where({id : row.pricing_tier})
          .then(tier_title =>{

            row.tier_title = tier_title[0].tier_title;
            resolve(row);
          })

      });
  });

})).then(response => {
  cb(sendData);
});

不确定查询是否确实执行完全相同的操作,但这只是演示了如何使用 knex 正确执行上述查询的基本思想。

实际上与加入 pricing_tier 相同,以防止需要 2 个单独的查询。

Promise.all(
  sendData.franchisee.map(row => {
    return knex('pricing_tier') 
      .withSchema('designer') // <-- selecting schema correctly in knex
      // this join could have been done as a subquery in select too...
      .join('settings', 'settings.setting_key', knex.raw('?', ['PRICING_TIER'])) 
      .select('settings.value', 'pricing_tier.tier_title')
      .where('pricing_tier.id', row.pricing_tier)
      .then(rows => {
        row.pricing_tier = rows[0].value;
        row.tier_title = rows[0].tier_title;
        return row;
      });
  })
).then(response => {
  cb(sendData); // <--- generally bad idea to mix promises and callbacks
});

结果SQL是这样的:

select 
  `settings`.`value`, 
  `pricing_tier`.`tier_title` 
from `designer`.`pricing_tier` 
inner join `designer`.`settings` on `settings`.`setting_key` = 'PRICING_TIER' 
where `pricing_tier`.`id` = 3219