从零开始搭建nestjs项目-3-配置数据库连接(typeorm)

工具版本

  1. nodejs:20.9.0
  2. npm:10.1.0
  3. nestjs:10.0.0

相关包

dotenv用来解析.env文件

pnpm i dotenv typeorm @nestjs/typeorm mysql2

配置typeorm

大概思路:将数据库的一些基础配置放到环境变量中,比如数据库的账号,密码,库名,端口号等,利用dotenv去解析.env文件,最后导出配置项,并且在app.module.ts中使用

匹配所有实体时const entitiesDir = [path.join(__dirname, '../**/*.entity{.ts,.js}')],路径容易配置错误,若报错,请先确认路径是否配置正确

注意:synchronize配置项正式环境下不要设置true,此配置会同步数据库和实体,有可能导致数据库中表的数据被清空,可以参考typeorm官方文档,有具体的解决方案

创建配置文件src/config/orm.config.ts

import { TypeOrmModuleOptions } from "@nestjs/typeorm";
import * as fs from 'fs';
import * as dotenv from 'dotenv'
import { DB_Enum } from "src/enums/typeorm-config.enum";
import * as path from "path";


// 匹配所有实体
const entitiesDir = [path.join(__dirname, '../**/*.entity{.ts,.js}')]

// 通过环境变量读取不同的.env文件
function getEnv(env: string): Record<string, string> {
    if (fs.existsSync(env)) {
        return dotenv.parse(fs.readFileSync(env))
    }
    return {}
}
// 通过dotENV来解析不同的配置
function buildConnectionOptions() {
    const defaultConfig = getEnv('.env');
    const envConfig = getEnv(`.env.${process.env.NODE_ENV || 'development'}`);
    const config = {
        ...defaultConfig,
        ...envConfig
    }
    return {
        type: 'mysql',
        host: config[DB_Enum.HOST],
        port: (config[DB_Enum.PORT]),
        username: config[DB_Enum.USERNAME],
        password: config[DB_Enum.PASSWORD],
        database: config[DB_Enum.DATABASE],
        entities: entitiesDir,
        synchronize: JSON.parse(config[DB_Enum.SYNC]),//同步本地的schema与数据库 ->初始化的时候使用
        logging: ['error'],//日志等级
    }
}

export const connectionOptions = buildConnectionOptions() as TypeOrmModuleOptions;

枚举类型

export enum DB_Enum {
    HOST = 'DB_HOST',
    PORT = 'DB_PORT',
    USERNAME = 'DB_USERNAME',
    PASSWORD = 'DB_PASSWORD',
    DATABASE = 'DB_DATABASE',
    SYNC = 'DB_SYNC',
}

环境变量配置,可自行在.env.production和.env.development中配置

DB_HOST=
DB_PORT=3306
DB_USERNAME=
DB_PASSWORD=
DB_DATABASE=
DB_SYNC=false

在app.module.ts中配置

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { ConfigModule } from '@nestjs/config'
import { WinstonModule } from 'nest-winston';
import { winstonModuleOptions } from './config/log.config';
import { APP_FILTER } from '@nestjs/core';
import { AllExceptionFilter } from './filters/all-exception/all-exception.filter';
import { TypeOrmModule } from '@nestjs/typeorm';
import { connectionOptions } from './config/orm.config';

@Module({
  imports: [
    // 环境变量配置
    ConfigModule.forRoot({
      isGlobal: true,
      // 指定存储环境变量的文件, 靠前的文件拥有较高的优先级
      envFilePath: [`.env.${process.env.NODE_ENV || 'development'}`, '.env'],
    }),

    // 数据库配置
    TypeOrmModule.forRoot(connectionOptions),
    

    // 日志
    WinstonModule.forRoot(winstonModuleOptions),

  ],
  controllers: [AppController],
  providers: [
    AppService,
    {
      provide: APP_FILTER,
      useClass: AllExceptionFilter
    },
  ],
})
export class AppModule { }

使用

需要在对应的模块中导入要使用的实体, TypeOrmModule.forFeature([]),//在哪个服务使用实体,就要在对应的模块使用forFeature引入对应的实体,比如如果要在app.service.ts中使用user这个实体,那么就需要在app.module.ts中添加: TypeOrmModule.forFeature([User])

import { TypeOrmModule } from '@nestjs/typeorm';
import { User } from './entities/User.entity';

@Module({
...
  imports: [
    // 数据库配置
    TypeOrmModule.forRoot(connectionOptions),
    TypeOrmModule.forFeature([User]),//在哪个服务使用实体,就要在对应的模块使用forFeature引入对应的实体     可删除

  ],
  ...
})
export class AppModule { }

app.service.ts中注入实体即可使用,代码:

import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { User } from 'src/entities/User.entity';
import { Repository } from 'typeorm';

@Injectable()
export class AppService {
    constructor(
        @InjectRepository(User) private readonly userRepository: Repository<User>
    ) { }
}

根据现有的数据库自动生成实体

相关包:

pnpm i typeorm-model-generator

相关参数说明,参考typeorm-model-generator - npm (npmjs.com)

Usage: typeorm-model-generator -h <host> -d <database> -p [port] -u <user> -x
[password] -e [engine]

Options:
  --help                 Show help                                     [boolean]
  --version              Show version number                           [boolean]
  -h, --host             IP address/Hostname for database server
                                                          [default: "127.0.0.1"]
  -d, --database         Database name(or path for sqlite)            [required]
  -u, --user             Username for database server
  -x, --pass             Password for database server              [default: ""]
  -p, --port             Port number for database server
  -e, --engine           Database engine
          [choices: "mssql", "postgres", "mysql", "mariadb", "oracle", "sqlite"]
                                                              [default: "mssql"]
  -o, --output           Where to place generated models
                            [default: "./output"]
  -s, --schema           Schema name to create model from. Only for mssql
                         and postgres. You can pass multiple values
                         separated by comma eg. -s scheme1,scheme2,scheme3
  --ssl                                               [boolean] [default: false]

在package.json中配置

{
...
  "scripts": {
        "generator:models": "typeorm-model-generator -h yourHost -p 3306 -d yourDatabase -u username -x password -e mysql -o ./src/entities"

  },
...
}

使用:

pnpm run generator:models

结束

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值