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 [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 {}

  • 26
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值