安装 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 中的数据库操作相关推荐

  1. 使用SQL数据库在Python中进行CRUD操作

    目录 介绍 背景 在Visual Studio中创建一个Python项目 在SQL中创建数据库和表 为数据库创建配置文件 将Python软件包安装为"Pypyodbc" 创建一个连 ...

  2. 使用SQL数据库在Python中执行CRUD操作

    目录 介绍 背景 在Visual Studio中创建一个Python项目 在SQL中创建数据库和表 为数据库创建配置文件 安装Python包 "Pypyodbc" 创建连接文件 创 ...

  3. JS学习笔记六:js中的DOM操作

    1. JS学习笔记六:js中的DOM操作 文章目录 1. JS学习笔记六:js中的DOM操作 1.1. 获取Dom节点 1.2. 元素属性的操作方式 1.3. DOM节点的创建.插入和删除 1.4. ...

  4. 前端开发:JS中关于去重操作的使用

    前言 前端开发里面,在JS中关于数据去重操作的使用是非常常用,也是非常重要的点,一般情况下关于对数组去重点操作是最常用的,其次是具体的关于某一数据类型的去重操作,如字符串去重.数字去重等.那么本篇博文 ...

  5. json对象、字符串-数组和数学对象中的相关方法、BOM对象、JS中的DOM操作

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 json对象 字符串对象的相关方法 获取字符串长度 length 清除两侧的空白 trim [ python的strip ] ...

  6. nestjs配置MySQL数据库_数据库连接配置《 Nest.js 应用框架:数据库 》

    先要给项目安装几个依赖的模块,在终端,安装 @nestjs/typeorm,typeorm 本身,还需要一个数据库引擎,我们用的是 MySQL 数据库系统,所以这里还得再安装一下 mysql ,把它们 ...

  7. egg.js中使用egg-mysql操作mysql数据库

    1.在 egg 项目中安装 egg-mysql npm i egg-mysql --save 2.在 {app_root}/config/plugin.js 中启用 egg-mysql 插件: 'us ...

  8. Nest.js中的设计模式——装饰器

    背景 Nest是围绕一种称为装饰器的语言特性构建的. 装饰器风格的实现 Nest在面向对象设计中用到了装饰器模式去组织代码. 装饰器模式是一种动态地往一个类别中添加新的行为的设计模式 在写项目的时候, ...

  9. java实现 mysql 身份认证,java-从Filter中的数据库对用户进行身份验证是一种好习惯吗?...

    我正在为Android App创建Rest API(Spring Boot项目).从数据库对用户进行身份验证的理想方法应该是什么? 1.在控制器类中查询数据库 2.在过滤器类中查询数据库 3.使用Sp ...

最新文章

  1. Excel35招必学秘技
  2. MaxCompute(原ODPS)使用总结-初级篇
  3. 合并外部知识库-学习资料
  4. qml-创建可移动的模态弹出框
  5. ORACLE复杂查询之连接查询
  6. Grunt构建工具能做哪些事?
  7. strcat与strncat的C/C++实现
  8. linux安装java、配置 jmeter
  9. 华为5大设计师讲述HarmonyOS UX设计背后的故事
  10. 信息安全工程师第二版知识点总结
  11. 什么是智能家电?消费者不知判定标准
  12. 微信公众号之自定义菜单
  13. 浅谈软件项目规模估计——怎么估?
  14. AndLua加密解密
  15. STC89C52RC定时器的最基本实例
  16. 安卓个人中心头像模块(从相册选择和照相功能,适配7.0)
  17. 股票质押式回购 非担保交收 结算备付金 B股转H股
  18. 【NLP+图神经网络+推荐领域】2020年最新综述性文章推荐
  19. matlab神经网络模拟圆棒表面裂纹拓展
  20. 巴菲特致股东的一封信:1982年

热门文章

  1. 高并发高负载的大型网站系统架构
  2. 企业如何正确选择云ERP管理软件
  3. Windows Phone开发(25):启动器与选择器之WebBrowserTask
  4. 大型网站SEO执行策略
  5. 说话不能太绝对,要留有余地
  6. (论坛答疑点滴)怎么在datagrid翻页的时候确认?
  7. 判断一个变量是不是数组
  8. ASP.NET 动态输出Javascript 文本格式换行问题 [ASP.NET | C# | Response]
  9. 【ActiveMQ】消息生产者自动注入报错:Could not autowire. No beans of 'JmsMessagingTemplate' type found...
  10. SCVMM 2012 R2运维管理十之:添加外围网络计算机