Учебник по NestJS + Angular
Эта статья является частью серии, в которой я описываю систему синхронизации входа / выхода. Если вы хотите узнать больше, вы можете прочитать следующее:
- Система входа / выхода, часть 1: Схема
- Система входа / выхода, часть 2: базовая серверная часть - модуль аутентификации
- Система входа / выхода, часть 3: базовая серверная часть - модуль пользователя
- Система входа / выхода, часть 4: базовая серверная часть - модуль приложения
- Система входа / выхода, часть 5: база данных семян и данные миграции
- Система входа / выхода, часть 6: базовый интерфейс
- Система Clock-In / Out. Часть 7: Развертывание серверной части (NestJS) с помощью Docker / Docker-Compose
- Система входа / выхода, часть 8: развертывание внешнего интерфейса (Angular 6+) с использованием сред
- Система Clock-In / Out. Часть 9: Внутреннее тестирование - Модульное тестирование сервисов
- Система Clock-In / Out. Часть 10: Внутреннее тестирование - Модульное тестирование контроллеров
- Система тактового входа / выхода, часть 11: внутреннее тестирование - тестирование E2E
- Система ввода / вывода, часть 12: предварительное тестирование - модульное тестирование
- Система Clock-In / Out, часть 13: Front-End тестирование - интеграционное тестирование
В предыдущих частях я описал разработку серверной части системы синхронизации, но нет данных, подтверждающих, что наша серверная часть была успешно разработана.
В этой части я собираюсь описать, как я создал серию скриптов (TypeScript), которые позволяют заполнять базу данных из листа Excel, предоставленного клиентом из его старого программного обеспечения (MS Excel).
Первым шагом является добавление сценария npm в package.json
, который позволяет выполнять наш сценарий в TypeScript, используя ts-node .
Выполнение нашего скрипта выполнит команду npm run init:db
.
Сценарий create-data-fixture
- это самоисполняющаяся функция, которая создает новый объект на основе DatabaseTest
и вызывает метод db.reload()
.
Функция DatabaseTest
создается с использованием двух параметров:
- Соединение с базой данных, используемое для хранения данных, которое будет отличаться при каждом выполнении, если мы хотим использовать разные базы данных. Этот факт интересен, когда мы хотим иметь разные базы данных параллельно, выполняя тесты e2e (end-to-end) с фиктивными данными.
DataFixture
- объект, содержащий информацию, которая будет вставлена в базу данных (Users
иUsers-schedule
).
Самый простой файл - это TestFixture
, который экспортирует данные после того, как они были импортированы и загружены из файла XLS сценария сопоставления данных (который также будет разработан нами).
С другой стороны, файл database.test.ts
отвечает за загрузку поддельных данных в базу данных. То есть Users
и UsersSchedule
будут взяты из test.fixture
файла.
Опишем этот файл, так как он достаточно важный:
- Класс
DatabaseTest
получает соединение с базой данных и имитируемые данные из файлаtest.fixture
с помощью DI (внедрение зависимостей). - Инициализируется атрибут
modelsCharged
, в котором хранятся модели, которые уже были загружены в базу данных, и нет необходимости их перезагружать. - Метод
createConnectionDB
является статическим для подключения к базе данных извне класса. Таким образом, когда класс внедряется, соединение уже установлено успешно.
Следующим шагом является создание основных методов для инициализации, перезагрузки и синхронизации базы данных.
Затем загружаются модели, которые рекурсивно выполняются одна за другой, принимая информацию о существующих зависимостях между различными моделями.
Подводя итог, показан полный файл database.test
:
Бонус
Далее мы покажем метод XLSToJson
, который просто состоит из преобразования каждой строки Excel в различные объекты JSON, которые необходимо импортировать с помощью TypeORM.
Важно отметить, что каждому разработчику придется адаптировать функцию XLSToJson
из своего XLS.
Прежде всего, нам нужно установить пакет node-xlsx
, который позволяет нам взаимодействовать с файлами XLS. Ниже представлена первая версия, которая использует несколько forEach
циклов для прохождения и построения структуры данных, подобной следующей: [планировщики, пользователи], где scheduler
- объект следующего типа:
А user
- это объект следующего типа:
{ uid: string, name: string, }
Я не считаю, что следующий код находится в его самой чистой версии, что он не в самой чистой версии, и я планирую хороший рефакторинг, когда система будет завершена, в одной из будущих частей.
Если кто-то хочет приступить к этой задаче, предлагаются следующие пункты:
- Извлеките функции в соответствии с выполняемыми задачами, а не одну большую отдельную функцию.
- Замените
forEach
методы, скрывающие классическую структуру данных, более функциональными и подходящими методами, такими какreduce
.
migration.ts
:
Заключение
В этой части я объяснил свою исходную базу данных, которая состоит из серии скриптов, которые позволяют мне загружать любую структуру данных в базу данных.
Для импорта из Excel был создан специальный скрипт, конвертирующий файл XLS в JSON.
Проект GitHub - это https://github.com/Caballerog/clock-in-out.
Ветвь GitHub этой статьи: https://github.com/Caballerog/clock-in-out/tree/part5-seed-database