Size: a a a

NodeUA - JavaScript and Node.js in Ukraine

2021 June 23

DH

Dima Haponov in NodeUA - JavaScript and Node.js in Ukraine
бывают разные синхронности?
источник

Т

Тёмыч in NodeUA - JavaScript and Node.js in Ukraine
та просто ж можно await юзать. Или вообще через Promise.all переписать
источник

ES

Eugene Stepanyuk in NodeUA - JavaScript and Node.js in Ukraine
подскажите пожалуйста, пытаюсь выполнить запрос с помощью map в массиве данных.
```const cards = await payload.map((items: any) => {
   sequelize.query(
   `insert into DOC(documents_id, Executors_id, Executor_type, parent_id)
    values(:documents_id, :executors_id, :executor_type, :parent_id)`,
       {
           replacements: {
             documents_id: items.documentsId ?? null,
              executors_id: items.performerId ?? null,
              executor_type: items.peformerType ?? null,
             parent_id: items.parentId ?? null
       },
         type: QueryTypes.INSERT,
      });
       });```
вылетает ошибка `(node:18164) UnhandledPromiseRejectionWarning: SequelizeDatabaseError: Transaction (Process ID 68) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun
the transaction.`
источник

О

ОЛЕГ in NodeUA - JavaScript and Node.js in Ukraine
Думаю нужно попробовать через sequelize.createMany. И вы мапом возвращаете новый масив промисов и там нужно использовать Promise.all(или allSettled)
источник

О

ОЛЕГ in NodeUA - JavaScript and Node.js in Ukraine
И до того вы эти промисы не возвращаете. Можно убрать скобки или написать return
источник

ES

Eugene Stepanyuk in NodeUA - JavaScript and Node.js in Ukraine
это не весь код, return есть
сам запрос внутри try/catch и после запроса выполняется
if (!cards) {
           return { success: false, error: ErrorCode.notFound };
       }

       return {
           success: true,
           content: console.log('Insert success!'),
       };
источник

Y

Yevhen in NodeUA - JavaScript and Node.js in Ukraine
Уберите await
const cards = await payload.map

map вернет массив, на нем нельзя делать await (точнее можно, но результат будет не тот, который Вы ожидаете)
источник

Y

Yevhen in NodeUA - JavaScript and Node.js in Ukraine
Тут лучше Promise.allSettled. Если Promise.all то Вы не узнаете что именно зафейлилось, а что выполнилось.
источник

Y

Yevhen in NodeUA - JavaScript and Node.js in Ukraine
Имелся в виду return внутри map
источник

Y

Yevhen in NodeUA - JavaScript and Node.js in Ukraine
У Вас там deadlock. Возможно из-за того, что пытаетесь одновременно сделать несколько вставок в одну и ту же таблицу.
Чтобы узнать подробнее, нужно знать схему и настройки БД
источник

Y

Yevhen in NodeUA - JavaScript and Node.js in Ukraine
map берет на вход коллекцию из n элементов и возвращает коллекцию из n преобразованных элементов.
Вы в callback, который передается в map, ничего не возвращаете. Получается, на выходе будет массив из n undefined элементов.

Посмотрите картинку здесь
https://dev.to/lucagrandicelli/js-map-filter-reduce-explained-572e
источник
2021 June 24

h

hilarion_von_juzefin... in NodeUA - JavaScript and Node.js in Ukraine
привіт, у моєму тестовому завданні є такі пункти:
"
-Описати TS інтерфейси Shop, Cashier (касир), CashRegister. TS інтерфейси мають використовувати enums там, де це можливо та потрібно.


-Забезпечити CRUD комунікацію з реляційною БД сутності Cashier. Усі CRUD методи мають приймати типізовані параметри, а метод читання має приймати кілька фільтрів. Наприклад, age, sex, yearsOfExperience, worksInShifts, тощо.

Поля сутностей на твій вибір та твою фантазію. Вибір реляційної бази довільний.  Можна використовувати команди SQL або за бажанням ORM.
"

Я це зрозумів так: в бд мають бути три пов'язаня між собою таблиці Shop, Cashier (касир), CashRegister. Далі я опишу інтерфейс для Cashier і буду його застосовувати при CRUD операціях.
Але для чого мені описувати інтерфейси для Shop та CashRegister, якщо я взаємодію лише із таблицею Cashier?
Це тому що, наприклад, таблиця Cashier в бд посилається на таблицю Shop і тому й інтерфейс Cashier повинен посилатися на інтерфейс Shop?
источник

Т

Тёмыч in NodeUA - JavaScript and Node.js in Ukraine
десь я це тестове бачив
источник

Т

Тёмыч in NodeUA - JavaScript and Node.js in Ukraine
chatbots studio?
источник

Т

Тёмыч in NodeUA - JavaScript and Node.js in Ukraine
тому що касир буде містити у собі Шоп скоріше за все, та CashRegister
источник

h

hilarion_von_juzefin... in NodeUA - JavaScript and Node.js in Ukraine
+
источник

Т

Тёмыч in NodeUA - JavaScript and Node.js in Ukraine
ну і ви вірно відповіли на питання самі
источник

h

hilarion_von_juzefin... in NodeUA - JavaScript and Node.js in Ukraine
спасибі
источник

ES

Elena Sharovar in NodeUA - JavaScript and Node.js in Ukraine
Привет! Как покрыть тестами функцию которая по сути делает сложный сырой SQL запрос в базу (для отчета)? Что-то типа такого

function getSalesReport() {
   // здесь длинный SQL
   const sql = ‘SELECT …. FROM transactions t, orders o, cliens c ….. WHERE … GROUP BY …’
   try {
      const rows = await db.query(sql);
      return rows
   } catch (err) {
      throw new Error(`Failed to get Sales Report: ${err.message}`)
   }
}

юнит тест который проверяет что функция db.query была вызвана именно с тем запросом почти бестолковый:

jest.spyOn(db, ‘’query);
await getSalesReport();
expect(db.query.calls[0][0]).toEqual(‘SELECT …. FROM transactions t, orders o, cliens c ….. WHERE … GROUP BY`)

потому что если в SQL запросе будет обращение к несуществующему полю то тест этого не поймает. только интеграционные тесты да?
источник

ES

Elena Sharovar in NodeUA - JavaScript and Node.js in Ukraine
я знаю что в некоторых случаях поднимают in-memory базу данных для юнит тестов. делают так или это антипаттерн?
источник