前言
对于全栈or后端人员来说数据操作是必需掌握的技能,本章节主要讲解nestjs通过TypeORM框架(ORM 对象关系映射)来对MySQL数据表user进行查询,添加操作,通过Docker构建MySQL环境,方便同学们快速搭建环境
效果
通过Postman查看nestjs框架应用创建,查询mysql数据
快速创建nestjs应用
通过nestjs CLI脚手架快速创建应用(点击查看如何快速创建应用): mysql-nestjs
nest new mysql-nestjs
创建成功后进入项目启动应用
cd mysql-nestjs
npm run start:dev
接下来开始配置mysql环境
Docker 安装 mysql
1.首先需要下载 Docker应用程序
下载地址对应系统的安装包
Docker安装成功后点开该应用,这是可以看到Containers为空的
- 创建
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是:testdbadminer管理数据库简单而强大的工具,方便可视化查看数据,通过localhost:8080访问页面
- 启动
Docker容器
在项目mysql-nestjs根目录下运行指令启动Docker 镜像
docker-compose up -d
其中 -d 为后台运行,具体Docker指令点击查看 ,启动成功后可以看到Docker应用程序中Containers容器运行情况:
浏览器访问:localhost:8080访问adminer页面,首先需要登录
输入上面配置Mysql image账号信息,可以看到testdb数据里无table
- 创建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上的操作步骤:
nestjs链接mysql
这里使用TypeORM框架(ORM 对象关系映射)来建立应用程序与数据库之间的连接,它提供一个高效的方式来进行数据库操作,通过@nestjs/typeorm更好使用TypeORM
- 安装TypeORM依赖
npm install --save @nestjs/typeorm typeorm mysql2
- 创建
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 { }
- 配置 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方便快速的来接口请求
- POST请求
localhost:3000/users创建user记录,Body 使用Json格式(NestJS 提供了对 JSON 格式的强大支持。通过使用@Body()装饰器)
接口成功返回添加的 user 记录
2.GET请求 localhost:3000/users,查看user列表
最后我们也可以在adminer中查看到user table中插入的数据
总结
本文主要是通过TypeORM让nestjs应用链接mysql并对user table数据进行创建,查询操作,其中为了抹平开发过程中的运行环境差异使用了Docker安装mysql 生态环境