Запрос knex, возвращающий логику логики

Я пишу несколько запросов 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();
            }
      });

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

1
0
1 405
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Во-первых, code и eventId должны возвращать логическое значение, только если тип данных этого столбца - логический. Чтобы получить 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()

Спасибо человеку, которого я никогда не встречал, за твердый ответ

JvB 02.11.2018 11:05

Другие вопросы по теме