工具版本
- nodejs:20.9.0
- npm:10.1.0
- 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
结束