nestjs配置MySQL数据库,Nest.js 中的数据库操作
安装 Typeorm
为了与 SQL 和 NoSQL 数据库集成,Nest.js 提供了@nestjs/typeorm 软件包。Nest.js 使用 TypeORM,因为它是 TypeScript 最成熟的对象关系映射器(ORM)。由于它是用 TypeScript 编写的,因此可以与 Nest.js 框架很好地集成。
要开始使用它,先安装所需的依赖项:
npm install --save @nestjs/typeorm typeorm mysql2
本文数据库环境是 MySQL 8 下进行测试,依赖安装完成后在 AppModule(app.module.ts) 添加 TypeOrmModule 配置并且注入整个项目支持:
import { Module } from '@nestjs/common'
import { Connection } from 'typeorm'
import { TypeOrmModule } from '@nestjs/typeorm'
import { AppController } from './app.controller'
import { AppService } from './app.service'
@Module({
imports: [
TypeOrmModule.forRoot({
type: 'mysql',
host: 'localhost',
port: 3306,
username: 'root',
password: '12345678',
database: 'nest-demo1',
entities: ['dist/**/*.entity.js'],
synchronize: true
})
],
controllers: [AppController],
providers: [AppService]
})
export class AppModule {
constructor(private connection: Connection) {}
}
存储库模式
TypeORM支持存储库设计模式,每个实体都有自己的存储库。这些存储库可以从数据库连接中获取。例如创建一个 user 实体:
nest g module user
生成 user 文件夹后,新建个 user.entity.ts 实体:
import { Entity, Column, PrimaryColumn, BeforeInsert, CreateDateColumn, UpdateDateColumn } from 'typeorm'
import { v4 as uuidV4 } from 'uuid'
@Entity('app_user')
export class UserEntity {
@PrimaryColumn({
type: 'varchar',
length: 36,
nullable: false,
comment: '用户编号'
})
id: string
@BeforeInsert()
updateId(): void {
this.id = uuidV4()
}
@Column({
type: 'varchar',
length: 50,
unique: true,
comment: '用户名'
})
username: string
@Column({
type: 'varchar',
length: 200,
comment: '密码'
})
password: string
@Column({
type: 'varchar',
length: 320,
unique: true,
comment: '邮箱'
})
email: string
@Column({
comment: '昵称'
})
nickname: string
@Column({
default: true,
comment: '用户状态'
})
isActive: boolean
@CreateDateColumn({
type: 'timestamp',
name: 'created_time',
default: () => 'CURRENT_TIMESTAMP(6)',
comment: '创建时间'
})
createdTime: Date
@UpdateDateColumn({
type: 'timestamp',
name: 'updated_time',
default: () => 'CURRENT_TIMESTAMP(6)',
onUpdate: 'CURRENT_TIMESTAMP(6)',
comment: '更新时间'
})
updatedTime: Date
}
上面涉及到各种名词请参考:TypeOrm文档,上面配置文件有个字段 entities: ['dist/**/*.entity.js'] 项目涉及所有的实体类命名风格都是这样,这样一来程序启动就会注册自己的实体。然后在 UsersModule 注册指定的实体类 user.module.ts :
import { Module } from '@nestjs/common'
import { TypeOrmModule } from '@nestjs/typeorm'
import { UserController } from './user.controller'
import { UserService } from './user.service'
import { UserEntity } from './user.entity'
@Module({
imports: [TypeOrmModule.forFeature([UserEntity])],
controllers: [UserController],
providers: [UserService]
})
export class UserModule {}
然后下面进行编写 user 业务,打开 user.service.ts :
import { Injectable } from '@nestjs/common'
import { InjectRepository } from '@nestjs/typeorm'
import { Repository } from 'typeorm'
import { UserEntity } from './user.entity'
@Injectable()
export class UserService {
constructor(
@InjectRepository(UserEntity)
private userRepository: Repository
) {}
findAll(): Promise {
return this.userRepository.find()
}
findOne(id: string): Promise {
return this.userRepository.findOne(id)
}
async remove(id: string): Promise {
await this.userRepository.delete(id)
}
}
创建好之后,下面进行编写控制器的路由来访问 user.controller.ts:
import { Controller, Get, Post, Delete, Body, Param } from '@nestjs/common'
import { CreateUserDto } from './dto/create-user.dto'
import { UserEntity } from './user.entity'
import { UserService } from './user.service'
@Controller('user')
export class UserController {
constructor(private readonly userService: UserService) {}
@Post()
create(@Body() createUserDto: CreateUserDto): Promise {
return this.userService.create(createUserDto)
}
@Get()
findAll(): Promise {
return this.userService.findAll()
}
@Get(':id')
findOne(@Param('id') id: string): Promise {
return this.userService.findOne(id)
}
@Delete(':id')
remove(@Param('id') id: string): Promise {
return this.userService.remove(id)
}
}
上面除了创建,其他都很好理解,都是根据 Orm 方法执行对应的方法,创建用户需要用到 DTO (Data Transfer Object) 创建的简单类模式来创建需要的对象,在 user 文件夹下新建个 dto 文件夹,创建 create-user.dto.ts :
import { IsNotEmpty } from 'class-validator'
export class CreateUserDto {
@IsNotEmpty()
readonly username: string
@IsNotEmpty()
readonly password: string
@IsNotEmpty()
readonly email: string
@IsNotEmpty()
readonly nickname: string
}
创建好之后在 user.service.ts 添加 create() 方法:
create(createUserDto: CreateUserDto): Promise {
const user = new UserEntity()
user.username = createUserDto.username
user.password = createUserDto.password
user.email = createUserDto.email
user.nickname = createUserDto.nickname
return this.userRepository.save(user)
}
class-validator 是实用的数据验证工具:npm i class-validator
结语
上述代码数据库使用就是这样,不过细节上还有很多问题,比如新增用户要注意用户名的重复,删除需要验证等,这些后续再慢慢完善。
nestjs配置MySQL数据库,Nest.js 中的数据库操作相关推荐
- 使用SQL数据库在Python中进行CRUD操作
目录 介绍 背景 在Visual Studio中创建一个Python项目 在SQL中创建数据库和表 为数据库创建配置文件 将Python软件包安装为"Pypyodbc" 创建一个连 ...
- 使用SQL数据库在Python中执行CRUD操作
目录 介绍 背景 在Visual Studio中创建一个Python项目 在SQL中创建数据库和表 为数据库创建配置文件 安装Python包 "Pypyodbc" 创建连接文件 创 ...
- JS学习笔记六:js中的DOM操作
1. JS学习笔记六:js中的DOM操作 文章目录 1. JS学习笔记六:js中的DOM操作 1.1. 获取Dom节点 1.2. 元素属性的操作方式 1.3. DOM节点的创建.插入和删除 1.4. ...
- 前端开发:JS中关于去重操作的使用
前言 前端开发里面,在JS中关于数据去重操作的使用是非常常用,也是非常重要的点,一般情况下关于对数组去重点操作是最常用的,其次是具体的关于某一数据类型的去重操作,如字符串去重.数字去重等.那么本篇博文 ...
- json对象、字符串-数组和数学对象中的相关方法、BOM对象、JS中的DOM操作
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 json对象 字符串对象的相关方法 获取字符串长度 length 清除两侧的空白 trim [ python的strip ] ...
- nestjs配置MySQL数据库_数据库连接配置《 Nest.js 应用框架:数据库 》
先要给项目安装几个依赖的模块,在终端,安装 @nestjs/typeorm,typeorm 本身,还需要一个数据库引擎,我们用的是 MySQL 数据库系统,所以这里还得再安装一下 mysql ,把它们 ...
- egg.js中使用egg-mysql操作mysql数据库
1.在 egg 项目中安装 egg-mysql npm i egg-mysql --save 2.在 {app_root}/config/plugin.js 中启用 egg-mysql 插件: 'us ...
- Nest.js中的设计模式——装饰器
背景 Nest是围绕一种称为装饰器的语言特性构建的. 装饰器风格的实现 Nest在面向对象设计中用到了装饰器模式去组织代码. 装饰器模式是一种动态地往一个类别中添加新的行为的设计模式 在写项目的时候, ...
- java实现 mysql 身份认证,java-从Filter中的数据库对用户进行身份验证是一种好习惯吗?...
我正在为Android App创建Rest API(Spring Boot项目).从数据库对用户进行身份验证的理想方法应该是什么? 1.在控制器类中查询数据库 2.在过滤器类中查询数据库 3.使用Sp ...
最新文章
- Excel35招必学秘技
- MaxCompute(原ODPS)使用总结-初级篇
- 合并外部知识库-学习资料
- qml-创建可移动的模态弹出框
- ORACLE复杂查询之连接查询
- Grunt构建工具能做哪些事?
- strcat与strncat的C/C++实现
- linux安装java、配置 jmeter
- 华为5大设计师讲述HarmonyOS UX设计背后的故事
- 信息安全工程师第二版知识点总结
- 什么是智能家电?消费者不知判定标准
- 微信公众号之自定义菜单
- 浅谈软件项目规模估计——怎么估?
- AndLua加密解密
- STC89C52RC定时器的最基本实例
- 安卓个人中心头像模块(从相册选择和照相功能,适配7.0)
- 股票质押式回购 非担保交收 结算备付金 B股转H股
- 【NLP+图神经网络+推荐领域】2020年最新综述性文章推荐
- matlab神经网络模拟圆棒表面裂纹拓展
- 巴菲特致股东的一封信:1982年
热门文章
- 高并发高负载的大型网站系统架构
- 企业如何正确选择云ERP管理软件
- Windows Phone开发(25):启动器与选择器之WebBrowserTask
- 大型网站SEO执行策略
- 说话不能太绝对,要留有余地
- (论坛答疑点滴)怎么在datagrid翻页的时候确认?
- 判断一个变量是不是数组
- ASP.NET 动态输出Javascript 文本格式换行问题 [ASP.NET | C# | Response]
- 【ActiveMQ】消息生产者自动注入报错:Could not autowire. No beans of 'JmsMessagingTemplate' type found...
- SCVMM 2012 R2运维管理十之:添加外围网络计算机