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
結語
上述代碼數據庫使用就是這樣,不過細節上還有很多問題,比如新增用戶要注意用戶名的重復,刪除需要驗證等,這些后續再慢慢完善。
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的nestjs配置MySQL数据库,Nest.js 中的数据库操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql安装 linux 5.6,Li
- 下一篇: ckeditor4 php,CKEdit