环境变量配置
请先安装依赖
npm i --save @nestjs/config
npm install --save joi // 用于验证
.env文件
# 数据库配置 DB_HOST=xxx DB_PORT=3306 DB_USER=root DB_PASS=xxx DB_NAME=test # 自定义变量 APP_PORT=3000 APP_NAME=MyNestApp DATABASE_USER=test DATABASE_PASSWORD=test
src/config/database.config.ts
import { registerAs } from '@nestjs/config';
export default registerAs('database', () => ({
host: process.env.DB_HOST ?? 'localhost',
port: process.env.DB_PORT ? parseInt(process.env.DB_PORT, 10) : 3306,
user: process.env.DB_USER ?? 'root',
pass: process.env.DB_PASS ?? '',
name: process.env.DB_NAME ?? 'testdb',
}));
在app.module.ts里使用
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { Test1Module } from './test1/test1.module';
import { TypeOrmModule } from '@nestjs/typeorm';
import { UserModule } from './user/user.module';
import { ConfigModule, ConfigService } from '@nestjs/config';
import * as Joi from 'joi';
import appConfig from './config/app.config';
import databaseConfig from './config/database.config';
interface DatabaseConfig {
host: string;
port: number;
user: string;
pass: string;
name: string;
}
@Module({
imports: [
ConfigModule.forRoot({
// 全局配置
isGlobal: true,
// 忽略 .env 文件
// ignoreEnvFile: true,
// 指定环境文件
// envFilePath: '.development.env',
load: [appConfig, databaseConfig],
validationSchema: Joi.object({
APP_PORT: Joi.number().default(3000),
DB_HOST: Joi.string().required(),
DB_PORT: Joi.number().default(3306),
DB_USER: Joi.string().required(),
DB_PASS: Joi.string().allow(''),
DB_NAME: Joi.string().required(),
}),
}),
Test1Module,
// TypeORM 数据库连接
TypeOrmModule.forRootAsync({
imports: [ConfigModule],
inject: [ConfigService],
useFactory: (configService: ConfigService) => {
const dbConfig = configService.get<DatabaseConfig>('database')!;
return {
type: 'mysql',
host: dbConfig.host,
port: dbConfig.port,
username: dbConfig.user,
password: dbConfig.pass,
database: dbConfig.name,
entities: [],
synchronize: true, // 开发模式自动建表
autoLoadEntities: true, // 自动加载实体
};
},
}),
UserModule,
],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
在普通service中使用
// src/user/user.service.ts import { Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; import { User } from './entities/user.entity'; import { CreateUserDto } from './dto/create-user.dto'; import { ConfigService } from '@nestjs/config'; @Injectable() export class UserService { constructor( @InjectRepository(User) private userRepo: Repository<User>, private configService: ConfigService, // 注入 ConfigService ) {} async create(createUserDto: CreateUserDto): Promise<User> { const user = this.userRepo.create(createUserDto); return this.userRepo.save(user); } async findAll( page = 1, limit = 10, ): Promise<{ data: User[]; total: number; page: number; limit: number }> { const port = this.configService.get<number>('app.port') || 3001; console.log(port); const [data, total] = await this.userRepo.findAndCount({ skip: (page - 1) * limit, take: limit, order: { id: 'ASC' }, }); return { data, total, page, limit }; } }
浙公网安备 33010602011771号