Запрос Knex, возвращающий логическую переменную - PullRequest
0 голосов
/ 31 октября 2018

Я пишу некоторые запросы knex, чтобы проверить, является ли предоставленный код, иначе известный как voucher, допустимым при 4 ограничениях.

  • Ваучер существует
  • Срок действия ваучера не истек
  • Ваучер на правильное мероприятие
  • Осталось достаточно ваучеров

Мой текущий код (несмотря на то, что он не закончен) следующий:

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

Секция, о которой я беспокоюсь, - это секционный код. Я видел, как кто-то использовал это онлайн где-то, но больше не могу найти его в стеке потока. По моему предположению, все константы code, eventId и т. Д. Должны возвращать true или false и затем иметь возможность использоваться в моей логике if. Это правильно или совершенно неправильно?

1 Ответ

0 голосов
/ 02 ноября 2018

Во-первых, code и eventId должны возвращать bool, только если тип данных этого столбца - bool. Чтобы получить bool, вы должны манипулировать ответом на каждый запрос, например, проверив наличие свойства в ответе или добавив операторы case в ваш запрос (IMO получится немного грязным).

Во-вторых, я бы предложил отказаться от использования 4 запросов, которые объединяются с Promise.All(), и перейти к одному запросу в соответствии с приведенным ниже текстом (при условии, что вам не нужно явно знать, почему запрос отвечает результатов нет):

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()
...