• home > webfront > server > NestJS >

    nestjs如实连接mysql,并使用TypeORM

    Date:

    nestjs使用msyql案例与nestjs使用TypeORM连接mysql使用案例,参考配置

    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 = [
      {
        provideDATA_SOURCE_REPOSITORY,
        inject: [ConfigService],
        useFactoryasync (configServiceConfigService) => {
          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文件,只使用运行时注入的环境变量
          ignoreEnvFilefalse,
          // 是否是全局模块
          isGlobaltrue,
        }),
        I18nModule.forRoot({
          fallbackLanguage"en",
          loaderOptions: {
            path"src/i18n/",
            watchtrue,
          },
          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 = [
      {
        provideUSER_REPOSITORY,
        useFactory(dataSource: DataSource) =>
          dataSource.getRepository(UserEntity),
        inject: [DATA_SOURCE_REPOSITORY],
      },
    ];

    service注入

    import { InjectableInject } 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 { ConfigModuleConfigService } 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文件,只使用运行时注入的环境变量
          ignoreEnvFilefalse,
          // 是否是全局模块
          isGlobaltrue,
        }),
        I18nModule.forRoot({
          fallbackLanguage"en",
          loaderOptions: {
            path"src/i18n/",
            watchtrue,
          },
          resolvers: [
            { useQueryResolveroptions: ["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,
              synchronizetrue,
              autoLoadEntitiestrue,
            };
          },
          dataSourceFactoryasync (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(uidstring, 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

    TOP