Nest.js实战开发(第一弹)-连接mysql

为什么选用nest.js开发?

 之前也是使用过egg.js写过增删改查,对于egg.js的给我的体验感约束性很强,文档也很完善,但是对于Typescript的支持并不好,都2022年了,ts的应用也该很广泛了吧,所以此次开发选择了nest.js~

安装依赖包

npm install @nestjs/typeorm typeorm mysql2 -S

建立配置

 对于我们连接mysql的账密以及ip,我们将其存储在.env/.env.prod中。我们在根目录创建config文件夹,并创建env.ts,代码如下:

import * as fs from 'fs';
import * as path from 'path';
// 判断是否是开发环境
const isProd = process.env.NODE_ENV === 'production';

function parseEnv() {
  // 引入文件
  const localEnv = path.resolve('.env');
  // 引入线上环境文件
  const prodEnv = path.resolve('.env.prod');

  if (!fs.existsSync(localEnv) && !fs.existsSync(prodEnv)) {
    throw new Error('缺少环境配置文件');
  }
  // 判断是开发环境还是线上环境从而返回对应的filePath	
  const filePath = isProd && fs.existsSync(prodEnv) ? prodEnv : localEnv;
  return { path: filePath };
}
export default parseEnv();

创建.env/.env.prod文件,如下:

# 数据库地址
DB_HOST=ip地址
#  数据库端口
DB_PORT=3306
#  数据库登录名
DB_USER=root
#  数据库登录密码
DB_PASSWD=password
#  数据库名字
DB_DATABASE=db_name

引入此配置,并创建连接

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';

import { ConfigService, ConfigModule } from '@nestjs/config';
// env文件
import envConfig from '../config/env';
// 数据库
import { TypeOrmModule } from '@nestjs/typeorm';
import { UserModule } from './user/user.module';
@Module({
  imports: [
    // 将env文件注册
    ConfigModule.forRoot({
      isGlobal: true, // 设置为全局
      envFilePath: [envConfig.path],
    }),
    TypeOrmModule.forRootAsync({
      // 引入
      imports: [ConfigModule],
      inject: [ConfigService],
      useFactory: async (configService: ConfigService) => ({
        type: 'mysql', // 数据库类型
        host: configService.get('DB_HOST', '默认值'), // 主机,默认为localhost
        port: configService.get<number>('DB_PORT', 3306), // 端口号
        username: configService.get('DB_USER', '默认值'), // 用户名
        password: configService.get('DB_PASSWORD', '默认值'), // 密码
        database: configService.get('DB_DATABASE', '默认值'), //数据库名
        timezone: '+08:00', //服务器上配置的时区
        synchronize: true, //根据实体自动创建数据库表, 生产环境建议关闭
        entities: ['dist/**/*.entity{ .ts,.js}'], // 数据表实体
      }),
    }),
    UserModule,
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

创建服务

# 生成user模块
nest g mo user  
# 生成相应的service
nest g s user
# 生成相应的controller
nest g co user

执行对应的命令后我们可以删除其测试文件,接下来我们需要创建其对应的实体文件(这个时候数据库是已经创建好的),在user文件夹创建user.entity.ts文件,其内容如下:

//    posts/posts.entity.ts
import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';
// cd_user为我们所选择的数据库表
@Entity('cd_user')
export class User {
  @PrimaryGeneratedColumn()
  id: number; // 标记为主列,值自动生成

  @Column({ length: 50})
  username: string;

  @Column({ length: 20 })
  gender: string;
}

对应的user.service.ts文件:

import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
// 引入实体表
import { User } from './user.entity';

@Injectable()
export class UserService {
  constructor(
    @InjectRepository(User)
    private usersRepository: Repository<User>,
  ) {}
  // 找出表内全部项
  findAll() {
    return this.usersRepository.find();
  }
}

对应的user.controller.ts文件:

import { Body, Controller, Get, Post } from '@nestjs/common';
import { XCommonRet } from 'xmcommon';
import { UserService } from './user.service';

@Controller('user')
export class UserController {
  constructor(private readonly userService: UserService) {}
  // 此时访问的路径为user/all
  @Get('all')
  // @HttpCode(200)
  async all() {
  	// 固定了返回结构~
    const r = new XCommonRet();
    r.setData(await this.userService.findAll());
    return r;
  }
}

对应的user.module.ts文件:

import { Module } from '@nestjs/common';
import { UserService } from './user.service';
import { TypeOrmModule } from '@nestjs/typeorm';
import { UserController } from './user.controller';
import { User } from './user.entity';
// 创建了User.module.ts,注意整个module需要在app.modules.ts引入哦~
@Module({
  imports: [TypeOrmModule.forFeature([User])],
  providers: [UserService],
  controllers: [UserController],
  exports: [TypeOrmModule], 
})
export class UserModule {}

结束

 对于curd,以及其他对数据库的操作,想要了解更深的同学可以去看一下typeorm的文档,本文章只介绍如何连接mysql啦~

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值