Используйте TypeScript для улучшения проверки типов и добавления статических методов в модель Mongoose.

Что такое Мангуст?

Ха-ха.. не путайте. Я не буду говорить о нашем маленьком друге на картинке. Есть несколько способов заставить MongoDB работать с вашим приложением Node.js, и один из этих способов — использовать внешнюю библиотеку под названием Mongoose. Если вы посетите официальную страницу Mongoose, вы найдете это:

элегантное объектное моделирование mongodb для node.js

Я бы сказал, что это правда.

Но всегда есть возможность сделать наш код, нашу жизнь лучше, чем раньше. Чтобы сделать модели Mongoose лучше, давайте добавим TypeScript. Честное предупреждение, добавление TypeScript в любой существующий проект может показаться большой работой. В некотором смысле, это на самом деле много работы. Но это очень хорошо окупается…

🛠 Создание модели/схемы мангуста

Чтобы код нашего приложения мог взаимодействовать с MongoDB, мы должны сначала создать определение, известное как Модель/Схема. Мы можем думать, что это план того, как будут выглядеть наши данные и какие данные должны быть разрешены пользователю.

При работе с TypeScript рекомендуется создать тип или интерфейс. Определение свойств с помощью неявного определения типа действительно очень помогает.

💻 Время кода

➕ Сначала только JavaScript

Рассмотрим следующий пример. Здесь мы создаем модель для User, которая будет регистрироваться или входить в наше приложение. Пользователю потребуется указать свои firstName, lastName, email и password для регистрации и email и password для входа в систему. Довольно просто, правда? Наша модель Mongoose будет выглядеть примерно так (на простом JavaScript):

➕ Добавление интерфейсов TypeScript

Время ввести TypeScript. Давайте определим наш interface, который будет использоваться для проверки типов нашей модели User.

  1. IUser — определяет, как выглядит User, какими свойствами обладает пользовательский объект и какие типы данных разрешены.
  2. IUserDocument — определяет, как будет выглядеть схема и структура документа ответа после того, как мы запустим любой запрос для получения данных из MongoDB. IUserDocument расширяет интерфейсы IUser и Document, реализуя свойства обоих.
  3. IUserModel — определяет, как будет выглядеть окончательная модель User, какими свойствами она будет обладать и какие дополнительные методы она будет содержать (если они есть).

Вам может быть любопытно, что это за UserSchema.statics.buildUser? Обычно мы делаем что-то вроде let newUser = new User({...properties}), чтобы создать нового пользователя. Именно это и происходит в методе buildUser(args: IUser), присоединенном к UserSchema как статический метод.

🚨 Код, Собери!

Теперь, когда у нас есть простой код JS и интерфейсы TS, пришло время сделать все это как одно целое.

  1. Schema<IUserDocument> — определяет структуру схемы, ожидаемые свойства и соответствующие типы данных.
  2. buildUser(args: IUser): IUserDocument — статический метод, прикрепленный к модели, является еще одним способом создания нового пользователя вместо использования new User({...data}).
  3. Наконец, User — это модель Mongoose, которая возвращает документ типа IUserDocument и имеет методы и свойства, определенные в IUserModel.

И у нас есть! Модель saferUser, определяемая интерфейсами. Если в какой-то момент при создании нового пользователя будет передан неверный тип данных, компилятор TypeScript тут же на нас закричит и выдаст ошибки.

Подробнее о Mongoose читайте на их официальном сайте. Всегда помните, что нет ничего лучше официальной документации.

Спасибо за чтение 🙏

Если вам понравилась эта статья, обязательно ознакомьтесь с другими моими статьями, где я рассказываю о React и Node.js.

🚀 Отписка!

Дополнительные материалы на PlainEnglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter и LinkedIn. Посетите наш Community Discord и присоединитесь к нашему Коллективу талантов.