NestJS 如何连接 MySQL 数据库

52 阅读2分钟

所需依赖

pnpm i @nestjs/typeorm mysql2 typeorm

目录结构

|- config
| |- config.yaml # 通用配置文件
|- src
| |- common
|   |- database.module.ts # 自定义的数据库连接模块
| |- app.module.ts

涉及文件

1、config.yaml

# 数据库相关配置
database:
  host: '127.0.0.1' # 数据库服务器地址(本地数据库填写 127.0.0.1,远程数据库填写对应 IP 或域名)
  port: 3306 # 数据库服务器端口(MySQL 默认端口为 3306)
  username: 'root' # 连接数据库的用户名(需拥有对应数据库的操作权限)
  password: 'root123456' # 连接数据库的密码(与用户名对应)
  database: 'nestdb' # 要连接的具体数据库名称
  synchronize: false # 数据库结构自动同步开关(true 时启动时自动创建表结构,生产环境必须设为 false,避免数据丢失)

2、database.module.ts

import { Module } from '@nestjs/common'
import { ConfigService } from '@nestjs/config'
import { TypeOrmModule } from '@nestjs/typeorm'

@Module({
  imports: [
    TypeOrmModule.forRootAsync({
      useFactory(configService: ConfigService) {
        return {
          // 数据库类型:此处指定为 MySQL,支持 oracle/sqlite/mongodb 等
          type: 'mysql',
          // 数据库服务器地址:从配置中读取,默认 127.0.0.1
          host: configService.get<string>('database.host', '127.0.0.1'),
          // 数据库服务器端口:从配置中读取,默认 MySQL 默认端口 3306
          port: configService.get<number>('database.port', 3306),
          // 数据库登录用户名:从配置中读取,默认 root
          username: configService.get<string>('database.username', 'root'),
          // 数据库登录密码:从配置中读取,默认 123456
          password: configService.get<string>('database.password', '123456'),
          // 要连接的数据库名称:从配置中读取,默认 nestdb
          database: configService.get<string>('database.database', 'nestdb'),
          // 自动同步数据表结构:开发环境可开启,生产环境必须关闭(避免数据丢失)
          // 兜底值为 false,保障生产环境安全
          synchronize: configService.get<boolean>('database.synchronize', false),
          // 是否自动加载所有实体(无需手动在 entities 数组中注册)
          autoLoadEntities: true,
          // 时区配置:东八区(+08:00),解决数据库时间与本地时间不一致问题
          timezone: '+08:00',
          // 启用自动重连:数据库连接断开后自动尝试重连,提升服务稳定性
          reconnect: true,
          // 连接重试延迟时间:5000 毫秒(5秒),默认 3000 毫秒
          retryDelay: 5 * 1000,
          // 慢查询阈值:3000 毫秒(3秒),超过该时间的查询会被记录为慢查询
          maxQueryExecutionTime: 3 * 1000,
          // 最大连接重试次数:10 次,默认 10 次,失败后停止重试
          retryAttempts: 10,
          // 数据库连接池大小:10 个连接,优化并发查询性能
          poolSize: 10,
          // 数据库字符集与排序规则:utf8mb4 支持 emoji 表情,unicode_ci 大小写不敏感
          charset: 'utf8mb4_unicode_ci',
        }
      },
      inject: [ConfigService],
    }),
  ],
})
export class DatabaseModule {}

3、app.module.ts

import { Module } from '@nestjs/common'
import { DatabaseModule } from './common/module/database.module'

@Module({
  imports: [DatabaseModule]
})
export class AppModule {}