1、nest项目创建
通过npm下载全局nest框架
npm i -g @nestjs/cli
创建项目 nest new XXX(项目名)
nest new project-name
这里项目初始化目录就不再介绍了!
2、dotenv通过对.env文件进行解析,添加到process.env对象
注:process在node中是一个全局对象,提供node.js进程的信息和一些控制该进程的方法;process.env对象包含了当前进程的环境变量,如process.env.PATH.
安装dotenv
npm install dotenv --save
在项目目录下创建.env文件
.env 默认配置文件
DB_TYPE = mysql
DB_HOST = 127.0.0.1
DB_PORT = 3306
DB_SYNC = false
.env.development 开发环境配置文件
DB_DATABASE = typeorm2
DB_HOST = 127.0.0.1
DB_PORT = 3306
DB_USERNAME = root
DB_PASSWORD = xxxxx
.env.production 生产环境配置文件
-----这里就不做了,可以根据自己需要设置
.env.test 测试环境配置文件
------这里就不做了
当然重点是下面的nest/config
3、nest/config
在 NestJS 框架中,nest/config
是一个用于处理配置的模块,它允许你以一种结构化和可维护的方式管理应用程序配置。nest/config
模块提供了一个 ConfigService
,这是一个依赖注入服务,用于访问配置值。
安装nest/config
npm i --save @nestjs/config
在app.module中导入configModule(可以把config当作一个模块,我们可以在项目中应用他的服务ConfigService)、dotenv
import * as dotenv from 'dotenv';
import { ConfigModule, ConfigService } from '@nestjs/config';
判断环境,设置加载的.env文件
const envFilePath = `.env.${process.env.NODE_ENV || `development`}`;
在module中引入配置模块
ConfigModule.forRoot({
// 配置全局使用
isGlobal:true,
// 加载文件目录,开发环境即加载.env.development配置,此属性不写,则可以获取到.env的配置信息
envFilePath,
// ()=>dotenv.config({path:'.env'})默认加载了.env [portConfig先不写,稍后再说]
load:[portConfig,()=>dotenv.config({path:'.env'})],
// 数据校验,先不写
//validationSchema
}),
然后我们可以测试一下ConfigService,在app.controller中引入ConfigService,调用ConfigService.get('string')方法
import { Controller, Get } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
import { AppService } from './app.service';
@Controller()
export class AppController {
constructor(private readonly appService: AppService,
private configService: ConfigService) {}
@Get()
getHello(): string {
console.log(this.configService.get('PORT'));
return this.appService.getHello();
}
}
启动服务npm run start,访问接口
这里为了加深理解,我们设置一下启动端口的配置文件
在.env中添加PORT = 3033
#配置启动端口
PORT = 3033
在src目录下创建一个config文件,添加一个port.config.ts
export default ()=>({
// 如果环境中不存在启动端口,就使用端口3000
port: parseInt(process.env.PORT , 10) || 3000
})
app.module里引入,并且在configmodule.forRoot中加载,加载后,就可以通过configService.get
方法获取
import portConfig from './config/port.config';
在main.ts中导入configService
import { ConfigService } from '@nestjs/config';
实例化ConfigService,获取port
// 获取configService服务实例
const configService = app.get(ConfigService);
const port = configService.get<number>('port')
设置port,设置之后,我们就可以通过配置.env的PORT设置修改端口
await app.listen(port);
4、typeorm
安装typeorm环境 typeorm的nest配置文件 typeorm文件 mysql连接库文件
npm install --save @nestjs/typeorm typeorm mysql2
app.module导入
import { TypeOrmModule, TypeOrmModuleAsyncOptions } from '@nestjs/typeorm';
配置typeormmodule模块
TypeOrmModule.forRootAsync({
useFactory: ()=>
({
//通过process.env对象获取也没有问题
type:process.env.DB_TYPE,
//推荐使用configService获取 configService.get('DB_HOST')
host: ,
port:,
username:,
password: ,
database: ,
timezone: 'UTC',
charset: 'utf8mb4',
entities:[],
synchronize:,
logging:
})
})
启动项目,没问题就可以连上数据库了(数据库和建库,navicat的使用就不说了),但是没有止步于此...
5、joi
Joi 是一个基于 JavaScript 的对象模式验证库,广泛用于验证 JavaScript 对象,确保它们符合特定的模式。它经常被用于 Web 应用程序中,特别是在使用 Node.js 构建 API 时,来验证用户输入、配置文件等。
安装joi
npm i --save joi
app.module导入
import * as Joi from 'joi';
创建校验
// 校验
const validationSchema = Joi.object({
NODE_ENV:Joi.string().valid('development','production').default('development'),
DB_PORT: Joi.number().default(3306),
DB_HOST:Joi.string().ip(),
DB_TYPE:Joi.string().valid('mysql','postgres'),
DB_DATABASE: Joi.string().required(),
DB_USERNAME:Joi.string().required(),
DB_PASSWORD: Joi.string().required(),
DB_SYNC: Joi.boolean().default(false)
})
配置ConfigModule
ConfigModule.forRoot({
// 配置全局使用
isGlobal:true,
// 加载文件目录,开发环境即加载.env.development配置,此属性不写,则可以获取到.env的配置信息
envFilePath,
// ()=>dotenv.config({path:'.env'})默认加载了.env
load:[portConfig,()=>dotenv.config({path:'.env'})],
// 数据校验
validationSchema
}),
6、enum.config.ts
配置enum.config文件,我们可以通过ts文件,在不同环境下加载不同文件.
在config目录下创建enum.config.ts文件
export enum EnumConfig{
DB_DATABASE='DB_DATABASE',
DB_HOST='DB_HOST',
DB_PASSWORD='DB_PASSWORD',
DB_PORT='DB_PORT',
DB_SYNC='DB_SYNC',
DB_TYPE='DB_TYPE',
DB_USERNAME='DB_USERNAME'
}
在app.module引入
import { EnumConfig } from './config/enum.config';
配置typeormmodule
TypeOrmModule.forRootAsync({
imports:[ConfigModule],
inject:[ConfigService],
useFactory: (configService:ConfigService)=>
({
type:configService.get(EnumConfig.DB_TYPE),
host: configService.get(EnumConfig.DB_HOST),
port:configService.get(EnumConfig.DB_PORT),
username: configService.get(EnumConfig.DB_USERNAME),
password: configService.get(EnumConfig.DB_PASSWORD),
database: configService.get(EnumConfig.DB_DATABASE),
timezone: 'UTC',
charset: 'utf8mb4',
entities:[],
synchronize:configService.get(EnumConfig.DB_SYNC),
logging:process.env.NODE_ENV === 'development'
} as TypeOrmModuleAsyncOptions)
})
7、app.module完整代码和项目目录
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import portConfig from './config/port.config';
import { EnumConfig } from './config/enum.config';
import * as dotenv from 'dotenv';
// 导入config模块
import { ConfigModule, ConfigService } from '@nestjs/config';
import { TypeOrmModule, TypeOrmModuleAsyncOptions } from '@nestjs/typeorm';
import * as Joi from 'joi';
// 判断环境
const envFilePath = `.env.${process.env.NODE_ENV || `development`}`;
// 校验
const validationSchema = Joi.object({
NODE_ENV:Joi.string().valid('development','production').default('development'),
DB_PORT: Joi.number().default(3306),
DB_HOST:Joi.string().ip(),
DB_TYPE:Joi.string().valid('mysql','postgres'),
DB_DATABASE: Joi.string().required(),
DB_USERNAME:Joi.string().required(),
DB_PASSWORD: Joi.string().required(),
DB_SYNC: Joi.boolean().default(false)
})
@Module({
imports: [
ConfigModule.forRoot({
// 配置全局使用
isGlobal:true,
// 加载文件目录,开发环境即加载.env.development配置,此属性不写,则可以获取到.env的配置信息
envFilePath,
// ()=>dotenv.config({path:'.env'})默认加载了.env
load:[portConfig,()=>dotenv.config({path:'.env'})],
// 数据校验
validationSchema
}),
TypeOrmModule.forRootAsync({
imports:[ConfigModule],
inject:[ConfigService],
useFactory: (configService:ConfigService)=>
({
type:configService.get(EnumConfig.DB_TYPE),
host: configService.get(EnumConfig.DB_HOST),
port:configService.get(EnumConfig.DB_PORT),
username: configService.get(EnumConfig.DB_USERNAME),
password: configService.get(EnumConfig.DB_PASSWORD),
database: configService.get(EnumConfig.DB_DATABASE),
timezone: 'UTC',
charset: 'utf8mb4',
entities:[],
synchronize:configService.get(EnumConfig.DB_SYNC),
logging:process.env.NODE_ENV === 'development'
} as TypeOrmModuleAsyncOptions)
})
],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}