Использование Sequilize и async / await для поиска / создания записей в Node.js в правильном порядке - PullRequest
0 голосов
/ 01 апреля 2020

Я изо всех сил пытаюсь использовать Sequilize в Node.js правильно. Я читаю большое количество заказов, создаю из них уникальных клиентов или обновляю клиентов, имеющих несколько заказов. Поэтому для каждого заказа сначала я нахожу, существует ли клиент, создаю клиента, если он не существует, или обновляю клиента, если он есть. Но FindOne не удается найти нового клиента сразу после его создания, поэтому код в итоге пытается создать дублирующих клиентов (что не удается, поскольку customerId должен быть уникальным).

Я проверял, что новые клиенты находятся в процессе созданный в базе данных, просто не вовремя для запроса FindOne (). Есть ли что-то, что я должен сделать, чтобы обеспечить завершение записи новых клиентов в базу данных перед выполнением другого запроса FindOne?

Похоже, что Node накапливает десятки асинхронных c FindOne () запросов одновременно и выполняет Create () для этих заказов только после того, как запросы FindOne завершены для всех из них.

     let customer =  await CustomerModel.findOne({
       where: { customerId: order.customerId }
     })
     if (customer == null) {
       await CustomerModel.create({
         customerId: order.customerId,
         reorders: 0
       });
     } else {
       customer.reorders += 1;
       await customer.save()
     }
   } catch (error) {
     console.log(
       "Customer could not be created for id: " + order.customerId + " :" + JSON.stringify(error)
     );
   }```

1 Ответ

0 голосов
/ 01 апреля 2020

Хорошо, я нашел решение здесь. Я переключился с отдельных асин c операций на один атом c с использованием findOrCreate (), например:

const [customer, created] = await CustomerModel.findOrCreate({
        where: { customerId: order.customerId },
        defaults: {
          customerId: order.customerId,
          reorders: 0
        }
      });

Это не поможет мне в будущем, если у меня несколько асин c операции, которые я хочу выполнить, которые требуют поддержания их порядка в узле, если у кого-то есть какие-либо предложения, прыгайте.

...