使用 Node 操作数据库,可选择的 ORM 库有 TypeORMSequelize 等,这里选用 Sequelize-Typescript

下面以一个 user 模块为例,展示使用方法,该模块的结构如下:

  1. --module
  2. --user
  3. --user.controller.ts
  4. --user.model.ts
  5. --user.service.ts
  6. --user.module.ts

安装依赖

  1. yarn add @nestjs/sequelize sequelize sequelize-typescript mysql2
  2. yarn add @types/sequelize -D

定义模型

  1. // user.model.ts
  2. import { Column, Length, Model, Table, DataType } from 'sequelize-typescript'
  3. @Table({ tableName: 'User' })
  4. export class User extends Model<User> {
  5. @Column({ comment: '自增 ID', autoIncrement: true, primaryKey: true })
  6. id: number
  7. @Length({ min: 3, max: 32 })
  8. @Column({ comment: '姓名', type: DataType.STRING(32) })
  9. name: string
  10. @Column({ comment: '是否删除', defaultValue: false })
  11. _delete: boolean
  12. }

导入模块

  1. // app.module.ts
  2. import { Module } from '@nestjs/common'
  3. import { SequelizeModule } from '@nestjs/sequelize'
  4. @Module({
  5. imports: [
  6. SequelizeModule.forRoot({
  7. dialect: 'mysql',
  8. host: 'localhost',
  9. port: 3306,
  10. username: 'root',
  11. password: 'root',
  12. database: 'test',
  13. autoLoadModels: true, // 自动载入模型
  14. synchronize: true // 同步自动载入的模型
  15. }),
  16. ],
  17. })
  18. export class AppModule {}

实现 Service

在 service 中使用 model 操作数据库

  1. import { Injectable } from '@nestjs/common'
  2. import { InjectModel } from '@nestjs/sequelize'
  3. import { Sequelize } from 'sequelize-typescript'
  4. import { User } from './user.model'
  5. @Injectable()
  6. export class UserService {
  7. constructor(
  8. @InjectModel(User)
  9. private readonly userModel: typeof User
  10. ) {}
  11. async getOne(id: number) {
  12. const item = await this.userModel.findByPk(id)
  13. return item
  14. }
  15. }

实现 Controller

  1. import { Controller, Get, Param } from '@nestjs/common'
  2. import { UserService } from './user.service'
  3. @Controller('user')
  4. export class UserController {
  5. constructor(private readonly userService: UserService) {}
  6. @Get('/:id')
  7. async getOne(@Param('id') id: number) {
  8. return this.userService.getOne(id)
  9. }
  10. }

实现 Module

  1. import { Module } from '@nestjs/common'
  2. import { SequelizeModule } from '@nestjs/sequelize'
  3. import { User } from './user.model'
  4. import { UserController } from './user.controller'
  5. import { UserService } from './user.service'
  6. @Module({
  7. imports: [SequelizeModule.forFeature([User])],
  8. providers: [UserService],
  9. controllers: [UserController]
  10. })
  11. export class UserModule {}

参数配置

经过上面的步骤,一个使用 musql 数据库的简单模块就实现了,但是数据库参数配置硬编码在代码里面,并不是一个好的方案,这里通过 @nestjs/config 提供的配置能力,实现运行时参数注入。

首先,在项目根目录下创建 .env 文件

  1. # .env
  2. # MYSQL
  3. MYSQL_HOST=localhost
  4. MYSQL_PORT=3306
  5. MYSQL_USERNAME=root
  6. MYSQL_PASSWORD=root
  7. MYSQL_DATABASE=test

接下来,实现数据库模块

  1. // module/database/index.ts
  2. import { SequelizeModule } from '@nestjs/sequelize'
  3. import { ConfigModule, ConfigService } from '@nestjs/config'
  4. export default [
  5. SequelizeModule.forRootAsync({ // 注意,为了使用 ConfigModule,请使用 forRootAsync 方法
  6. imports: [ConfigModule],
  7. useFactory: (configService: ConfigService) => {
  8. return {
  9. dialect: 'mysql',
  10. host: configService.get('MYSQL_HOST'),
  11. port: configService.get('MYSQL_PORT'),
  12. username: configService.get('MYSQL_USERNAME'),
  13. password: configService.get('MYSQL_PASSWORD'),
  14. database: configService.get('MYSQL_DATABASE'),
  15. autoLoadModels: true,
  16. synchronize: true
  17. }
  18. },
  19. inject: [ConfigService]
  20. })
  21. ]

接下来,在根模块下引入配置模块

  1. // app.module.ts
  2. import { APP_FILTER } from '@nestjs/core'
  3. import { Module } from '@nestjs/common'
  4. import { ConfigModule } from '@nestjs/config'
  5. import { UserModule } from './module/user/user.module'
  6. import databaseModule from './module/database'
  7. @Module({
  8. providers: [
  9. {
  10. provide: APP_FILTER,
  11. useClass: ExceptionFilter
  12. }
  13. ],
  14. imports: [
  15. UserModule,
  16. ConfigModule.forRoot(),
  17. databaseModule
  18. ]
  19. })
  20. export class AppModule {}