Knex查询返回布尔逻辑

时间:2018-10-31 12:23:19

标签: sql postgresql knex.js

我正在编写一些knex查询,以检查在4个约束条件下提供的代码(也称为voucher)是否合法。

  • 优惠券存在
  • 凭证尚未过期
  • 优惠券用于正确的活动
  • 剩余的优惠券

我当前的代码(尽管尚未完成)如下:

export default () => (async (req, res) => {
      const { eventId, orderId, voucher, left } = req.params;

      const [{ code }, { eventId }, { expiryDate }, {quantity}] = await Promise.all([
        knex('vouchers')
          .where({
            code: voucher
          })
          .first(),
        knex('vouchers')
          .where({
            event_id
          })
          .first(),
        knex('mv_vouchers')
        .where({
            voucher_id: code,
            // 'left', > , 0,

        })
          .first(),
      ]);
            if (code && eventId && expiryDate && quantity) {

              await knex.insert([{order_id: orderId}, {voucher_id: voucher}], 'id').into('order_vouchers');
              res.status(202).end();

            } else{
              res.status(404).end();
            }
      });

我担心的部分是分段的代码。我看到有人在某个地方在线使用此功能,但是我一生都无法在stackoverflow上找到它。在我的假设下,常量codeeventId等应全部返回true或false,然后可以在我的if逻辑中使用。这是正确的路线还是完全错误?

1 个答案:

答案 0 :(得分:1)

首先,codeeventId仅应在该列的数据类型为布尔值时返回布尔值。要获取布尔值,您必须操纵每个查询的响应,例如通过检查响应中是否存在属性或向查询中添加case语句(会导致IMO混乱)。

第二,建议您不要使用与Promise.All()结合使用的4个查询,而是按照以下内容移至单个查询(假设您无需明确知道查询的原因)响应无结果):

export default () => (async (req, res) => {
  const { eventId, voucher } = req.params;
  const response = await knex('vouchers')
    .join('mv_vouchers', 'vouchers.id', 'mv_vouchers.voucherId')
    .where('vouchers.code', '=', voucher)
    .where('vouchers.event_id', '=', eventId)
    .first()