Подключение базы данных: TypeORM
До сих пор статьи хранились в массиве и пропадали при перезапуске. Теперь подключим базу данных. TypeORM — ORM-библиотека: она связывает классы TypeScript с таблицами и позволяет работать со строками как с объектами, не составляя SQL вручную. Пакет @nestjs/typeorm встраивает её в модули NestJS.
Установка
В курсе используется SQLite: вся база — один файл в папке проекта, отдельный сервер не нужен.
npm i @nestjs/typeorm typeorm better-sqlite3better-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.