nest 连接数据库并建表

115 阅读2分钟

连接数据库

pnpm add lodash mysql2 typeorm @nestjs/typeorm sanitize-html deepmerge
pnpm add @types/sanitize-html -D
rm -rf src/modules/core src/modules/example src/modules/content/types.ts src/modules/content/dtos src/app.controller.spec.ts src/app.controller.ts src/app.service.ts
nest g mo modules/core
nest g mo modules/database
res content

tip: res = nest g res

import { DynamicModule, Module } from '@nestjs/common';

@Module({})
export class CoreModule {
    static forRoot(): DynamicModule {
        return {
            module: CoreModule,
            global: true,
            providers: [],
            exports: [],
        };
    }
}

创建一个DynamicModule通常涉及到以下几个步骤:

  1. 首先,你需要导入DynamicModuleModule这两个类,分别来自@nestjs/common包。
  2. 然后,你需要创建一个DynamicModule实例,并传入一个包含所有服务的数组。这些服务可以是静态的,也可以是动态的。
  3. 最后,你需要调用DynamicModuleregister()方法,将这个模块注册到Nest的服务容器中。

在Nest框架中,forRoot()方法用于初始化一个模块,它支持TypeORM包中createConnection()函数公开的所有配置属性

import { Module } from '@nestjs/common';

import { ContentModule } from './modules/content/content.module';
import { CoreModule } from './modules/core/core.module';
import { DatabaseModule } from './modules/database/database.module';
import { PersonController } from './modules/person/person.controller';
import { PersonModule } from './modules/person/person.module';
import { PersonService } from './modules/person/person.service';

@Module({
    imports: [PersonModule, ContentModule, CoreModule.forRoot(), DatabaseModule],
    controllers: [PersonController],
    providers: [PersonService],
})
export class AppModule {}

删除了app.service app.controller

import { DynamicModule, Module } from '@nestjs/common';
import { TypeOrmModule, TypeOrmModuleOptions } from '@nestjs/typeorm';

@Module({})
export class DatabaseModule {
    static forRoot(configRegister: () => TypeOrmModuleOptions): DynamicModule {
        return {
            global: true,
            module: DatabaseModule,
            imports: [TypeOrmModule.forRoot(configRegister())],
        };
    }
}
// src/config/database.config.ts
import { TypeOrmModuleOptions } from '@nestjs/typeorm';

export const database = (): TypeOrmModuleOptions => ({
    // 以下为mysql配置
    charset: 'utf8mb4',
    logging: ['error'],
    type: 'mysql',
    host: '127.0.0.1',
    port: 3306,
    username: 'root',
    password: '12345678',
    database: '3rapp',
    synchronize: true,
    autoLoadEntities: true,
});

// src/config/index.ts
export * from './database.config';

import { database } from './config';

imports: [PersonModule, ContentModule, CoreModule.forRoot(), DatabaseModule.forRoot(database)],

创建entity

import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';

@Entity()
export class PersonEntity {
    @PrimaryGeneratedColumn()
    id: number;

    @Column()
    firstName: string;

    @Column()
    lastName: string;

    @Column()
    age: number;
}

image.png 这个图好像没啥用,实际数据库没生成表

import { Module } from '@nestjs/common';

import { TypeOrmModule } from '@nestjs/typeorm';

import { PersonEntity } from './entities';
import { PersonController } from './person.controller';
import { PersonService } from './person.service';

@Module({
    imports: [TypeOrmModule.forFeature([PersonEntity])],
    controllers: [PersonController],
    providers: [PersonService],
})
export class PersonModule {}

需要forFeature,才能生成表

forRoot forFeature的作用和使用场景

core好像没起什么作用 database。module database。config是有用的