Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Подключение базы данных: TypeORM

До сих пор статьи хранились в массиве и пропадали при перезапуске. Теперь подключим базу данных. TypeORM — ORM-библиотека: она связывает классы TypeScript с таблицами и позволяет работать со строками как с объектами, не составляя SQL вручную. Пакет @nestjs/typeorm встраивает её в модули NestJS.

Установка

В курсе используется SQLite: вся база — один файл в папке проекта, отдельный сервер не нужен.

npm i @nestjs/typeorm typeorm better-sqlite3

better-sqlite3 — драйвер, через который TypeORM обращается к файлу SQLite. Для PostgreSQL вместо него ставят пакет pg, а для MySQL — mysql2.

Подключение в корневом модуле

Путь к файлу базы уже лежит в .env (переменная DB_PATH), поэтому подключение читает его через ConfigService:

// src/app.module.ts
import { Module } from '@nestjs/common';
import { ConfigModule, ConfigService } from '@nestjs/config';
import { TypeOrmModule } from '@nestjs/typeorm';
import { PostsModule } from './posts/posts.module';
 
@Module({
  imports: [
    ConfigModule.forRoot({ isGlobal: true }),
    TypeOrmModule.forRootAsync({
      inject: [ConfigService],
      useFactory: (config: ConfigService) => ({
        type: 'better-sqlite3',
        database: config.get<string>('DB_PATH', 'blog.sqlite'),
        autoLoadEntities: true,
        synchronize: true,
      }),
    }),
    PostsModule,
  ],
})
export class AppModule {}

forRootAsync() откладывает настройку, пока не будет готов ConfigService: inject перечисляет нужные сервисы, а useFactory получает их и возвращает параметры подключения. Запустите npm run start:dev — в корне проекта появится файл blog.sqlite, а в терминале строка TypeOrmCoreModule dependencies initialized.

Параметры подключения

ПараметрЧто значит
typeКакая СУБД: better-sqlite3, postgres, mysql
databaseИмя базы, для SQLite — путь к файлу
autoLoadEntitiesСамостоятельно находить классы таблиц из модулей
synchronizeСоздавать и менять таблицы по классам при каждом запуске

Для PostgreSQL добавляются host, port, username и password — их тоже берут из .env.

Что такое synchronize

С synchronize: true TypeORM сравнивает классы сущностей с таблицами и сам приводит базу в соответствие: добавляет таблицы и столбцы. Для учебного проекта это удобно — не нужно писать SQL. Но при переименовании поля TypeORM может удалить столбец вместе с данными, поэтому на рабочем сервере этот режим выключают и используют миграции — файлы с описанием изменений базы.

Проверка

Пока в базе нет ни одной таблицы: TypeORM не знает, какие данные хранить. Классы таблиц — сущности — описываются в следующем уроке, и после этого таблицы появятся сами.

Частая ошибка

Ошибка DriverPackageNotInstalledError при запуске значит, что не установлен пакет драйвера, указанный в type. Для better-sqlite3 выполните npm i better-sqlite3. Если пакет стоит, но ошибка не уходит, удалите папку node_modules и выполните npm install — драйвер собирается под вашу версию Node.js.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.