NestJS连接MySQL数据库 1 -- Typeorm

打印 上一主题 下一主题

主题 887|帖子 887|积分 2661

1、nest项目创建

通过npm下载全局nest框架
  1. npm i -g @nestjs/cli
复制代码
创建项目 nest new XXX(项目名)
  1. nest new project-name
复制代码
这里项目初始化目录就不再介绍了!
2、dotenv通过对.env文件举行解析,添加到process.env对象

注:process在node中是一个全局对象,提供node.js进程的信息和一些控制该进程的方法;process.env对象包含了当进步程的环境变量,如process.env.PATH.
安装dotenv
  1. npm install dotenv --save
复制代码
在项目目录下创建.env文件

.env 默认配置文件
  1. DB_TYPE = mysql
  2. DB_HOST = 127.0.0.1
  3. DB_PORT = 3306
  4. DB_SYNC = false
复制代码
.env.development 开发环境配置文件
  1. DB_DATABASE = typeorm2
  2. DB_HOST = 127.0.0.1
  3. DB_PORT = 3306
  4. DB_USERNAME = root
  5. DB_PASSWORD = xxxxx
复制代码
.env.production 生产环境配置文件
-----这里就不做了,可以根据本身需要设置
.env.test 测试环境配置文件
------这里就不做了
当然重点是下面的nest/config
3、nest/config

在 NestJS 框架中,nest/config 是一个用于处理配置的模块,它允许你以一种结构化和可维护的方式管理应用步伐配置。nest/config 模块提供了一个 ConfigService,这是一个依赖注入服务,用于访问配置值。
安装nest/config
  1. npm i --save @nestjs/config
复制代码
在app.module中导入configModule(可以把config看成一个模块,我们可以在项目中应用他的服务ConfigService)、dotenv
  1. import *  as dotenv from 'dotenv';
  2. import { ConfigModule, ConfigService } from '@nestjs/config';
复制代码
判定环境,设置加载的.env文件
  1. const envFilePath = `.env.${process.env.NODE_ENV || `development`}`;
复制代码
在module中引入配置模块
  1. ConfigModule.forRoot({
  2.       // 配置全局使用
  3.       isGlobal:true,
  4.       // 加载文件目录,开发环境即加载.env.development配置,此属性不写,则可以获取到.env的配置信息
  5.       envFilePath,
  6.       // ()=>dotenv.config({path:'.env'})默认加载了.env [portConfig先不写,稍后再说]
  7.       load:[portConfig,()=>dotenv.config({path:'.env'})],
  8.       // 数据校验,先不写
  9.       //validationSchema
  10.     }),
复制代码
然后我们可以测试一下ConfigService,在app.controller中引入ConfigService,调用ConfigService.get('string')方法
  1. import { Controller, Get } from '@nestjs/common';
  2. import { ConfigService } from '@nestjs/config';
  3. import { AppService } from './app.service';
  4. @Controller()
  5. export class AppController {
  6.   constructor(private readonly appService: AppService,
  7.               private configService: ConfigService) {}
  8.   @Get()
  9.   getHello(): string {
  10.     console.log(this.configService.get('PORT'));
  11.     return this.appService.getHello();
  12.   }
  13. }
复制代码
启动服务npm run start,访问接口


这里为了加深理解,我们设置一下启动端口的配置文件

在.env中添加PORT =  3033
  1. #配置启动端口
  2. PORT = 3033
复制代码
在src目录下创建一个config文件,添加一个port.config.ts
  1. export default ()=>({
  2.     // 如果环境中不存在启动端口,就使用端口3000
  3.     port: parseInt(process.env.PORT , 10) || 3000
  4. })
复制代码
app.module里引入,并且在configmodule.forRoot中加载,加载后,就可以通过configService.get
方法获取
  1. import portConfig from './config/port.config';
复制代码

在main.ts中导入configService
  1. import { ConfigService } from '@nestjs/config';
复制代码
实例化ConfigService,获取port
  1. // 获取configService服务实例
  2.   const configService = app.get(ConfigService);
  3.   const port = configService.get<number>('port')
复制代码
设置port,设置之后,我们就可以通过配置.env的PORT设置修改端口
  1. await app.listen(port);
复制代码
4、typeorm

安装typeorm环境    typeorm的nest配置文件 typeorm文件 mysql连接库文件
  1. npm install --save @nestjs/typeorm typeorm mysql2
复制代码
app.module导入
  1. import { TypeOrmModule, TypeOrmModuleAsyncOptions } from '@nestjs/typeorm';
复制代码
配置typeormmodule模块
  1. TypeOrmModule.forRootAsync({
  2.       useFactory: ()=>
  3.       ({
  4.         //通过process.env对象获取也没有问题
  5.         type:process.env.DB_TYPE,
  6.         //推荐使用configService获取  configService.get('DB_HOST')
  7.         host: ,
  8.         port:,
  9.         username:,
  10.         password: ,
  11.         database: ,
  12.         timezone: 'UTC',
  13.         charset: 'utf8mb4',
  14.         entities:[],
  15.         synchronize:,
  16.         logging:
  17.       })
  18.     })
复制代码
启动项目,没题目就可以连上数据库了(数据库和建库,navicat的使用就不说了),但是没有止步于此...
5、joi

Joi 是一个基于 JavaScript 的对象模式验证库,广泛用于验证 JavaScript 对象,确保它们符合特定的模式。它经常被用于 Web 应用步伐中,特殊是在使用 Node.js 构建 API 时,来验证用户输入、配置文件等。
安装joi
  1. npm i --save joi
复制代码
app.module导入
  1. import * as Joi from 'joi';
复制代码
创建校验
  1. // 校验
  2. const validationSchema = Joi.object({
  3.   NODE_ENV:Joi.string().valid('development','production').default('development'),
  4.   DB_PORT: Joi.number().default(3306),
  5.   DB_HOST:Joi.string().ip(),
  6.   DB_TYPE:Joi.string().valid('mysql','postgres'),
  7.   DB_DATABASE: Joi.string().required(),
  8.   DB_USERNAME:Joi.string().required(),
  9.   DB_PASSWORD: Joi.string().required(),
  10.   DB_SYNC: Joi.boolean().default(false)
  11. })
复制代码
配置ConfigModule
  1. ConfigModule.forRoot({
  2.       // 配置全局使用
  3.       isGlobal:true,
  4.       // 加载文件目录,开发环境即加载.env.development配置,此属性不写,则可以获取到.env的配置信息
  5.       envFilePath,
  6.       // ()=>dotenv.config({path:'.env'})默认加载了.env
  7.       load:[portConfig,()=>dotenv.config({path:'.env'})],
  8.       // 数据校验
  9.       validationSchema
  10.     }),
复制代码
6、enum.config.ts

配置enum.config文件,我们可以通过ts文件,在不恻隐况下加载差别文件.
在config目录下创建enum.config.ts文件
  1. export enum EnumConfig{
  2.     DB_DATABASE='DB_DATABASE',
  3.     DB_HOST='DB_HOST',
  4.     DB_PASSWORD='DB_PASSWORD',
  5.     DB_PORT='DB_PORT',
  6.     DB_SYNC='DB_SYNC',
  7.     DB_TYPE='DB_TYPE',
  8.     DB_USERNAME='DB_USERNAME'
  9. }
复制代码
在app.module引入
  1. import { EnumConfig } from './config/enum.config';
复制代码
配置typeormmodule
  1. TypeOrmModule.forRootAsync({
  2.       imports:[ConfigModule],
  3.       inject:[ConfigService],
  4.       useFactory: (configService:ConfigService)=>
  5.       ({
  6.         type:configService.get(EnumConfig.DB_TYPE),
  7.         host: configService.get(EnumConfig.DB_HOST),
  8.         port:configService.get(EnumConfig.DB_PORT),
  9.         username: configService.get(EnumConfig.DB_USERNAME),
  10.         password: configService.get(EnumConfig.DB_PASSWORD),
  11.         database: configService.get(EnumConfig.DB_DATABASE),
  12.         timezone: 'UTC',
  13.         charset: 'utf8mb4',
  14.         entities:[],
  15.         synchronize:configService.get(EnumConfig.DB_SYNC),
  16.         logging:process.env.NODE_ENV === 'development'
  17.       } as TypeOrmModuleAsyncOptions)
  18.     })
复制代码
7、app.module完整代码和项目目录


  1. 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`}`; // 校验
  2. const validationSchema = Joi.object({
  3.   NODE_ENV:Joi.string().valid('development','production').default('development'),
  4.   DB_PORT: Joi.number().default(3306),
  5.   DB_HOST:Joi.string().ip(),
  6.   DB_TYPE:Joi.string().valid('mysql','postgres'),
  7.   DB_DATABASE: Joi.string().required(),
  8.   DB_USERNAME:Joi.string().required(),
  9.   DB_PASSWORD: Joi.string().required(),
  10.   DB_SYNC: Joi.boolean().default(false)
  11. })@Module({  imports: [    ConfigModule.forRoot({
  12.       // 配置全局使用
  13.       isGlobal:true,
  14.       // 加载文件目录,开发环境即加载.env.development配置,此属性不写,则可以获取到.env的配置信息
  15.       envFilePath,
  16.       // ()=>dotenv.config({path:'.env'})默认加载了.env
  17.       load:[portConfig,()=>dotenv.config({path:'.env'})],
  18.       // 数据校验
  19.       validationSchema
  20.     }),    TypeOrmModule.forRootAsync({
  21.       imports:[ConfigModule],
  22.       inject:[ConfigService],
  23.       useFactory: (configService:ConfigService)=>
  24.       ({
  25.         type:configService.get(EnumConfig.DB_TYPE),
  26.         host: configService.get(EnumConfig.DB_HOST),
  27.         port:configService.get(EnumConfig.DB_PORT),
  28.         username: configService.get(EnumConfig.DB_USERNAME),
  29.         password: configService.get(EnumConfig.DB_PASSWORD),
  30.         database: configService.get(EnumConfig.DB_DATABASE),
  31.         timezone: 'UTC',
  32.         charset: 'utf8mb4',
  33.         entities:[],
  34.         synchronize:configService.get(EnumConfig.DB_SYNC),
  35.         logging:process.env.NODE_ENV === 'development'
  36.       } as TypeOrmModuleAsyncOptions)
  37.     })  ],  controllers: [AppController],  providers: [AppService],})export class AppModule {}
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

滴水恩情

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表