NestJS连接MySQL数据库 1 -- Typeorm
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
load:,
// 数据校验,先不写
//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,访问接口
https://i-blog.csdnimg.cn/direct/f3879b5dc0d54921bdb78c933b857b36.png
https://i-blog.csdnimg.cn/direct/5e89f17137c149aab0b96b5f271f2c3a.png
这里为了加深理解,我们设置一下启动端口的配置文件
在.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'; https://i-blog.csdnimg.cn/direct/9d6b21e5a60246988490d53fa0fd90cb.png
在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:,
// 数据校验
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:,
inject:,
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完整代码和项目目录
https://i-blog.csdnimg.cn/direct/179a3d87cf284b21ac7755f2acf8a0d5.png
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:,
// 数据校验
validationSchema
}), TypeOrmModule.forRootAsync({
imports:,
inject:,
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: ,providers: ,})export class AppModule {}
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]