NestJS 配置 TypeORM 进阶教程

简介: 本文介绍了在 NestJS 项目中配置 TypeORM 的三种方式:初级阶段直接在 AppModule 中配置;进阶阶段抽离出独立的 DatabaseModule;进一步使用自定义命名空间将数据库配置分离到单独文件,提升可维护性与模块化程度。

初级:在 AppModule 直接配置 TypeORM

1. 安装依赖

首先,安装 NestJS、TypeORM 以及 MySQL 驱动:

pnpm install @nestjs/typeorm typeorm mysql2 @nestjs/config

2. 创建 .env 文件

在项目根目录下创建 .env 文件,用于存储数据库配置信息:

DB_TYPE=mysql
DB_HOST=localhost
DB_PORT=3306
DB_USERNAME=root
DB_PASSWORD=123456
DB_NAME=login_nest
DB_SYNCHRONIZE=false
DB_LOG=true

3. 配置 AppModule

app.module.ts 中直接配置 TypeORM:

app.module.tsApplyimport { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { ConfigModule, ConfigService } from '@nestjs/config';
import * as path from 'path';

@Module({
  imports: [
    ConfigModule.forRoot({
      isGlobal: true,
    }),
    TypeOrmModule.forRootAsync({
      inject: [ConfigService],
      useFactory: (configService: ConfigService) => ({
        type: configService.get<string>('DB_TYPE', 'mysql'),
        host: configService.get<string>('DB_HOST', 'localhost'),
        port: configService.get<number>('DB_PORT', 3306),
        username: configService.get<string>('DB_USERNAME', 'root'),
        password: configService.get<string>('DB_PASSWORD', '123456'),
        database: configService.get<string>('DB_NAME', 'login_nest'),
        entities: [path.join(__dirname, '../common/entities/*.entity{.ts,.js}')],
        synchronize: configService.get<boolean>('DB_SYNCHRONIZE', false),
        logging: configService.get<boolean>('DB_LOG', true),
        autoLoadEntities: true,
      }),
    }),
    // 其他模块
  ],
  // 其他配置
})
export class AppModule {}

进阶:抽离 DatabaseModule 单独配置

1. 创建 DatabaseModule

src/database 目录下创建 database.module.ts 文件:

database.module.tsApplyimport { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { ConfigService } from '@nestjs/config';
import * as path from 'path';

@Module({
  imports: [
    TypeOrmModule.forRootAsync({
      inject: [ConfigService],
      useFactory: (configService: ConfigService) => ({
        type: configService.get<string>('DB_TYPE', 'mysql'),
        host: configService.get<string>('DB_HOST', 'localhost'),
        port: configService.get<number>('DB_PORT', 3306),
        username: configService.get<string>('DB_USERNAME', 'root'),
        password: configService.get<string>('DB_PASSWORD', '123456'),
        database: configService.get<string>('DB_NAME', 'login_nest'),
        entities: [path.join(__dirname, '../../common/entities/*.entity{.ts,.js}')],
        synchronize: configService.get<boolean>('DB_SYNCHRONIZE', false),
        logging: configService.get<boolean>('DB_LOG', true),
        autoLoadEntities: true,
      }),
    }),
  ],
  exports: [TypeOrmModule],
})
export class DatabaseModule {}

2. 在 AppModule 中引入 DatabaseModule

修改 app.module.ts 文件:

app.module.tsApplyimport { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
import { DatabaseModule } from './database/database.module';

@Module({
  imports: [
    ConfigModule.forRoot({
      isGlobal: true,
    }),
    DatabaseModule,
    // 其他模块
  ],
  // 其他配置
})
export class AppModule {}

进一步:使用自定义命名空间 databaseToken 抽离配置到单独文件

1. 创建数据库配置文件

src/config 目录下创建 database.config.ts 文件:

import { registerAs } from '@nestjs/config';

export const databaseToken = 'database';

console.log('数据库类型', process.env.DB_TYPE);

// 使用 registerAs 函数注册自定义命名空间
//registerAs 函数本身不能使用 ConfigService 读取变量,这是由于 NestJS 配置加载的顺序决定的,此处使用process.env
export const databaseConfig = registerAs(databaseToken, () => ({
  type: process.env.DB_TYPE,
  host: process.env.DB_HOST,
  port: process.env.DB_PORT,
  username: process.env.DB_USERNAME,
  password: process.env.DB_PASSWORD,
  database: process.env.DB_NAME,
  entities: [__dirname + '/../../common/entities/*.entity{.ts,.js}'],
  synchronize: process.env.DB_SYNCHRONIZE === 'true' || false,
  logging: process.env.DB_LOG === 'true' || false,
  autoLoadEntities: true,
}));

2. 修改 DatabaseModule

database.module.tsApplyimport { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { ConfigService } from '@nestjs/config';
import { databaseToken, databaseConfig } from '../config/database.config';

@Module({
  imports: [
    TypeOrmModule.forRootAsync({
      inject: [ConfigService],
      useFactory: (configService: ConfigService) => {
        const dbConfig = configService.get(databaseToken);
        return dbConfig;
      },
    }),
  ],
  exports: [TypeOrmModule],
})
export class DatabaseModule {}

3. 在 AppModule 中加载数据库配置

必须在ConfigModule使用 forRoot() 方法的 options 对象的 load 属性加载命名空间配置

app.module.tsApplyimport { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
import { DatabaseModule } from './database/database.module';
import { databaseConfig } from './config/database.config';

@Module({
  imports: [
    ConfigModule.forRoot({
      isGlobal: true,
      load: [databaseConfig],
    }),
    DatabaseModule,
    // 其他模块
  ],
  // 其他配置
})
export class AppModule {}

通过以上三个阶段,可以逐步优化 NestJS 项目中 TypeORM 的配置,让代码结构更清晰,更易于维护。

目录
相关文章
|
JSON 数据格式
Nestjs(三)接收参数 @Query @Body @Param(post、get 、put、delete ...)
Nestjs(三)接收参数 @Query @Body @Param(post、get 、put、delete ...)
1255 4
|
关系型数据库 测试技术 API
NestJS中TypeORM的使用
本文介绍了在 NestJS 中使用 TypeORM 实现数据库的 CRUD 操作,涵盖依赖安装、模块配置、实体定义、服务逻辑、控制器路由及 API 测试等步骤。
405 4
|
消息中间件 Kafka 程序员
kafka的Docker镜像使用说明(wurstmeister/kafka)
wurstmeister/kafka是镜像市场上很受欢迎的一个kafka镜像,今天来聊聊它的多种用法
7231 0
kafka的Docker镜像使用说明(wurstmeister/kafka)
|
8月前
|
前端开发 JavaScript API
什么是 Headless UI?
什么是 Headless UI?
791 115
|
6月前
|
JSON 监控 API
解析得物商品详情:API 接口调用实践与数据结构分析
本文详解得物平台商品详情API:涵盖GET请求方式、核心参数(productId/skuId)、JSON响应结构(含价格、库存、规格、图片等),并提供Python调用示例及频率限制、错误处理、合规使用等关键注意事项。(239字)
|
12月前
|
存储 人工智能 前端开发
从零构建智能对话助手:LangGraph + ReAct 实现具备记忆功能的 AI 智能体
本文系统介绍了基于 LangGraph 框架构建具备记忆能力的 ReAct(Reasoning + Action)智能体的技术实现方法。ReAct 智能体结合语言模型的推理能力与外部工具的执行能力,通过“思考-行动-观察”循环机制,实现复杂任务的自主处理。文章详细讲解了 LangGraph 的图结构设计、状态管理、工具集成与记忆系统等关键技术,并通过代码示例演示了从基础工作流到高级智能体系统的构建过程。最终实现的智能体具备多轮对话、工具调用、结果反馈与上下文记忆能力,为开发下一代智能应用提供了技术基础。
1667 1
|
机器学习/深度学习 编解码 自然语言处理
YOLOv8改进 | 2023 | CARAFE提高精度的上采样方法(助力细节长点)
YOLOv8改进 | 2023 | CARAFE提高精度的上采样方法(助力细节长点)
1183 2
|
Java 开发者
Java一分钟之-JavaFX布局管理:GridPane, VBox, HBox
本文介绍了JavaFX的三种常用布局管理器:GridPane、VBox和HBox。GridPane用于创建二维网格布局,需设置行和列约束以防止控件重叠。VBox按垂直方向堆叠控件,记得设置间距。HBox水平排列控件,可能需要分配额外空间以避免水平滚动条。示例代码展示了这三种布局的使用。理解并运用这些布局管理器能提升JavaFX应用的界面设计。
832 0
|
设计模式 Java 数据库
【禁用外键】为什么互联网大厂禁用外键约束?详谈外键的优缺点和使用场景
从多个层面分析数据库外键的优缺点,并给出外键的使用场景和禁止使用的场景。
2028 19
【禁用外键】为什么互联网大厂禁用外键约束?详谈外键的优缺点和使用场景

热门文章

最新文章