nestjs链接mysql操作数据

363 阅读4分钟

前言

对于全栈or后端人员来说数据操作是必需掌握的技能,本章节主要讲解nestjs通过TypeORM框架(ORM 对象关系映射)来对MySQL数据表user进行查询,添加操作,通过Docker构建MySQL环境,方便同学们快速搭建环境

效果

通过Postman查看nestjs框架应用创建,查询mysql数据

1.gif

快速创建nestjs应用

通过nestjs CLI脚手架快速创建应用(点击查看如何快速创建应用): mysql-nestjs

nest new mysql-nestjs

创建成功后进入项目启动应用

cd mysql-nestjs
npm run start:dev

接下来开始配置mysql环境

Docker 安装 mysql

1.首先需要下载 Docker应用程序

下载地址对应系统的安装包

image.png

Docker安装成功后点开该应用,这是可以看到Containers为空的

image.png
  1. 创建docker-compose.yml

在项目mysql-nestjs根目录下创建Docker容器应用的配置文件:docker-compose.yml,并定义服务镜像

# docker-compose.yml

# Use root/example as user/password credentials
version: '3.1'

services:
  db:
    image: mysql:8.0
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: example  
      MYSQL_DATABASE: testdb
    ports:
      - 3307:3306

  # navicat
  adminer:
    image: adminer
    restart: always
    ports:
      - 8080:8080

这里定义了两个镜像:

  • mysql的镜像,username默认为root,password为 example,database是:testdb
  • adminer管理数据库简单而强大的工具,方便可视化查看数据,通过localhost:8080访问页面
  1. 启动Docker容器

在项目mysql-nestjs根目录下运行指令启动Docker 镜像

docker-compose up -d 

其中 -d 为后台运行,具体Docker指令点击查看 ,启动成功后可以看到Docker应用程序中Containers容器运行情况:

image.png

浏览器访问:localhost:8080访问adminer页面,首先需要登录

image.png

输入上面配置Mysql image账号信息,可以看到testdb数据里无table

image.png
  1. 创建user table

为了后文nestjs链接mysql对表进行查询和创建操作,这里先提前创建user表,包含的字段:id,name(名字),age(年龄)sql如下:

CREATE TABLE IF NOT EXISTS user (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    age INT NOT NULL
);

adminer上的操作步骤:

image.png

nestjs链接mysql

这里使用TypeORM框架(ORM 对象关系映射)来建立应用程序与数据库之间的连接,它提供一个高效的方式来进行数据库操作,通过@nestjs/typeorm更好使用TypeORM

  1. 安装TypeORM依赖
npm install --save @nestjs/typeorm typeorm mysql2
  1. 创建 User module 本文主要介绍对User table操作,所以这里使用 nest cli 快速创建该模块(cli 指令了解),依次按顺序创建:
nest g mo user 
nest g co user --no-spec
nest g s user --no-spec

指令执行后会在src目录后会多出个user对应文件,这时候还需要在src/user目录下创建user实体类user.entity.ts

// src/user/user.entity.ts

import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';

@Entity()
export class User {
    @PrimaryGeneratedColumn()
    id: number;

    @Column()
    name: string;

    @Column()
    age: number;
}

user.service.ts 文件中创建查询,添加user的方法

// src/user/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(): Promise<User[]> {
        return this.usersRepository.find();
    }

    create(user: User): Promise<User> {
        return this.usersRepository.save(user);
    }
}

user.controller.ts添加对应api请求接口:

  • 查询user:GET localhost:3000/users
  • 创建user:POST localhost:3000/users
// src/user/user.controller.ts

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

@Controller('users')
export class UserController {
    constructor(private readonly userService: UserService) { }

    @Get()
    findAll(): Promise<User[]> {
        return this.userService.findAll();
    }

    @Post()
    create(@Body() user: User): Promise<User> {
        return this.userService.create(user);
    }

}

user.module.ts中引入 typeorm 和 user.entity.ts实体类映射mysql user

// src/user/user.module.ts

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { UserService } from './user.service';
import { UserController } from './user.controller';
import { User } from './user.entity';

@Module({
  imports: [TypeOrmModule.forFeature([User])],
  providers: [UserService],
  controllers: [UserController],
})
export class UserModule { }
  1. 配置 mysql connect

在项目src/app.module.ts(root module)中通过@nestjs/typeorm来链接mysql

// src/app.module.ts

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { UserModule } from './user/user.module';

@Module({
  imports: [
    TypeOrmModule.forRoot({
      type: 'mysql',
      host: 'localhost',
      port: 3307,
      username: 'root',
      password: 'example',
      database: 'testdb',
      entities: [__dirname + '/**/*.entity{.ts,.js}'],
      synchronize: true,
    }),
    UserModule,
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule { }

操作user表

本文使用Postman方便快速的来接口请求

  1. POST请求 localhost:3000/users 创建user记录,Body 使用Json格式(NestJS 提供了对 JSON 格式的强大支持。通过使用 @Body() 装饰器)
image.png

接口成功返回添加的 user 记录

2.GET请求 localhost:3000/users,查看user列表

image.png

最后我们也可以在adminer中查看到user table中插入的数据

image.png

总结

本文主要是通过TypeORMnestjs应用链接mysql并对user table数据进行创建,查询操作,其中为了抹平开发过程中的运行环境差异使用了Docker安装mysql 生态环境