nestjs如实连接mysql,并使用TypeORM
Date:
nestjs使用msyql
首先声明数据库配置
import { DataSourceOptions } from "typeorm"; import { ConfigService } from "@nestjs/config"; // 当前通过 npm scripts 执行的命令 const currentScript = process.env.npm_lifecycle_event; export function getDatabaseConfig(configService: ConfigService) { const dbPort = configService.get<string>("DB_PORT"); // 验证 DB_PORT 是否存在且为有效的数字 const port = dbPort ? parseInt(dbPort, 10) : 3306; const config: DataSourceOptions = { type: "mysql", host: configService.get("DB_HOST") || "127.0.0.1", port, username: configService.get("DB_USERNAME"), password: configService.get("DB_PASSWORD"), database: configService.get("DB_DATABASE"), synchronize: Boolean(configService.get("DB_SYNCHRONIZE")), // 解决通过 pnpm migration:run 初始化数据时,遇到的 SET FOREIGN_KEY_CHECKS = 0; 等语句报错问题, 仅在执行数据迁移操作时设为 true multipleStatements: currentScript === "typeorm", entities: ["dist/modules/**/*.entity{.ts,.js}"], migrations: ["dist/migrations/*{.ts,.js}"], subscribers: ["dist/modules/**/*.subscriber{.ts,.js}"], }; return config; }
dataSourceProviders
import { DataSource } from "typeorm"; import { ConfigService } from "@nestjs/config"; import { getDatabaseConfig } from "@/config/database.config"; export const DATA_SOURCE_REPOSITORY = "DATA_SOURCE"; export const databaseProviders = [ { provide: DATA_SOURCE_REPOSITORY, inject: [ConfigService], useFactory: async (configService: ConfigService) => { const databaseConfig = getDatabaseConfig(configService); const dataSource = new DataSource(databaseConfig); return dataSource.initialize(); }, }, ];
DataSourceModule
import { Module, Global } from '@nestjs/common'; import { databaseProviders } from './database.providers'; @Global() @Module({ providers: [...databaseProviders], exports: [...databaseProviders], }) export class DatabaseModule {}
然后再入口处引入就行了
import { Module } from "@nestjs/common"; import { ConfigModule } from "@nestjs/config"; import { UsersModule } from "@modules/users/users.module"; import { SpaceModule } from "@modules/space/space.module"; import { DatabaseModule } from "@share/database/database.module"; import { AcceptLanguageResolver, CookieResolver, I18nModule, QueryResolver, } from "nestjs-i18n"; @Module({ imports: [ ConfigModule.forRoot({ envFilePath: [".env", `.env.${process.env.NODE_ENV || "development"}`], // 控制是否不解析.env文件,只使用运行时注入的环境变量 ignoreEnvFile: false, // 是否是全局模块 isGlobal: true, }), I18nModule.forRoot({ fallbackLanguage: "en", loaderOptions: { path: "src/i18n/", watch: true, }, resolvers: [ { use: QueryResolver, options: ["lang"] }, new CookieResolver(["lang"]), AcceptLanguageResolver, ], }), DatabaseModule, UsersModule, SpaceModule, ], providers: [], }) export class AppModule {}
业务中使用
import { DataSource } from "typeorm"; import { UserEntity } from "./entities/user.entity"; import { DATA_SOURCE_REPOSITORY } from "@share/database/database.providers"; export const USER_REPOSITORY = "USER_REPOSITORY"; export const userProviders = [ { provide: USER_REPOSITORY, useFactory: (dataSource: DataSource) => dataSource.getRepository(UserEntity), inject: [DATA_SOURCE_REPOSITORY], }, ];
service注入
import { Injectable, Inject } from "@nestjs/common"; import { Repository } from "typeorm"; import { SpaceItem } from "./space.entity"; import { SPACE_REPOSITORY } from "@modules/space/space.providers"; @Injectable() export class SpaceService { constructor( @Inject(SPACE_REPOSITORY) private repository: Repository<SpaceItem>, ) {} async findAll(): Promise<SpaceItem[]> { return this.repository.find(); } findOne(uid: string) { return `This action returns a #${uid} user`; } update(uid: string) { return `This action updates a #${uid} user`; } remove(uid: string) { return `This action removes a #${uid} user`; } }
demo就好了
nestjs使用TypeORM连接mysql
只需把DataSourceModule 改TypeOrmModule.forRootAsync, 比如
import { getDatabaseConfig } from "@/config/database.config"; import { SpaceModule } from "@modules/space/space.module"; import { Module } from "@nestjs/common"; import { ConfigModule, ConfigService } from "@nestjs/config"; import { AcceptLanguageResolver, CookieResolver, I18nModule, QueryResolver, } from "nestjs-i18n"; import { TypeOrmModule } from "@nestjs/typeorm"; import { DataSource } from "typeorm"; @Module({ imports: [ ConfigModule.forRoot({ envFilePath: [".env", `.env.${process.env.NODE_ENV || "development"}`], // 控制是否不解析.env文件,只使用运行时注入的环境变量 ignoreEnvFile: false, // 是否是全局模块 isGlobal: true, }), I18nModule.forRoot({ fallbackLanguage: "en", loaderOptions: { path: "src/i18n/", watch: true, }, resolvers: [ { use: QueryResolver, options: ["lang"] }, new CookieResolver(["lang"]), AcceptLanguageResolver, ], }), TypeOrmModule.forRootAsync({ inject: [ConfigService], useFactory: (configService: ConfigService) => { // const loggerOptions = configService.get<string>("DB_LOGGING"); // const logging: LoggerOptions = loggerOptions // ? (JSON.parse(loggerOptions) as LoggerOptions) // : ["error"]; const databaseConfig = getDatabaseConfig(configService); return { ...databaseConfig, synchronize: true, autoLoadEntities: true, }; }, dataSourceFactory: async (options) => { const dataSource = await new DataSource(options!).initialize(); return dataSource; }, }), // UsersModule, SpaceModule, ], providers: [], }) export class AppModule {}
业务处改动
import { Module } from "@nestjs/common"; import { spaceProviders } from "@modules/space/space.providers"; import { SpaceService } from "@modules/space/space.service"; import { SpaceController } from "@modules/space/space.controller"; import { TypeOrmModule } from "@nestjs/typeorm"; import { SpaceEntity } from "@modules/space/space.entity"; @Module({ imports: [TypeOrmModule.forFeature([SpaceEntity])], controllers: [SpaceController], providers: [...spaceProviders, SpaceService], exports: [TypeOrmModule, SpaceService], }) export class SpaceModule {}
service处改动
import { BusinessException } from "@/common/exceptions/biz.exception"; import { ErrorEnum } from "@constants/error-code"; import { Injectable } from "@nestjs/common"; import { Repository } from "typeorm"; import { SpaceEntity } from "@modules/space/spaceEntity"; import type { SpaceFormDto } from "@modules/space/space.dto"; import { isEmpty } from "lodash"; import { InjectRepository } from "@nestjs/typeorm"; @Injectable() export class SpaceService { constructor( @InjectRepository(SpaceEntity) private readonly repository: Repository<SpaceEntity>, ) {} async findAll(): Promise<SpaceEntity[]> { return this.repository.find(); } async findOne(uid: string, field = "uid"): Promise<SpaceEntity | null> { const space = await this.repository .createQueryBuilder("space") .where(`user.${field} = :${field}`, { uid }) .getOne(); return space; } }
转载本站文章《nestjs如实连接mysql,并使用TypeORM》,
请注明出处:https://www.zhoulujun.cn/html/webfront/server/nestjs/9536.html
下一篇:最后一页