前提

nest.js 本身支持建议使用TypeORM 模块来处理数据库相关的操作,它为许多不同的数据库提供了支持,以 MySQL 为例,使用的官方的hello-world项目做示例
注:本例使用的typeORM因此有许多不懂的相关内容如:@Column、@Entity()、Repository、userRepository.query()

事前准备

首先电脑安装好Mysql数据库

然后通过电脑数据库连接工具测试连接,确定可以连接上(我使用的navicat),之后创建nest-study数据库以及库中的user表如下:

nestjs 如何映射 已有的表 nestjs数据库_nestjs 如何映射 已有的表


然后在src下面创建一个单独的模块文件夹和entities文件夹,这里以user模块为例,内容现在可以为空。(app.controller.spec.ts这个测试用例文件已删除掉)

nestjs 如何映射 已有的表 nestjs数据库_数据库_02


建议将所有的entity文件都放置在entities文件夹中,方便管理

安装数据库相关的模块

npm install --save @nestjs/typeorm typeorm mysql

总共三个内容,它们为nest连接数据库以及创造对应的实体类提供了操作与处理

开始实现

1.编写user.entity.ts

图例:

nestjs 如何映射 已有的表 nestjs数据库_图例_03


代码:

import { Column, Entity, PrimaryGeneratedColumn, BaseEntity } from 'typeorm';

@Entity()
export class UserEntity extends BaseEntity {
  @PrimaryGeneratedColumn()
  id: number;

  @Column({type:'varchar', name: 'name'})
  name: string;
}

实体类要与字段数据库表一一对应,至于装饰器相关的查阅typeorm中文官网

2.编写user.service.ts

图例:

nestjs 如何映射 已有的表 nestjs数据库_nest连接mysql_04


代码:

import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { UserEntity } from '../entities/user.entity';

@Injectable()
export class UserService {
  // 使用InjectRepository装饰器并引入Repository这样就可以使用typeorm的操作了
  constructor(
    @InjectRepository(UserEntity)
    private readonly userRepository: Repository<UserEntity>,
  ) { }
  // 获取所有用户数据列表(userRepository.query()方法属于typeoram)
  async findAll(): Promise<UserEntity[]> {
    return await this.userRepository.query('select * from user');
  }
}

这里的操作中没有任何的sql查询,直接用了find()方法查询出了所有数据,可以参考typeorm中文官网。

3.编写user.controller.ts

图例:

nestjs 如何映射 已有的表 nestjs数据库_nest连接数据库_05


代码:

import { Controller, Get } from '@nestjs/common';
import { UserService } from './user.service';
import { UserEntity } from '../entities/user.entity';

@Controller('user')
export class UserController {
  constructor(private readonly userService: UserService) { }

  @Get('list')
  findAll(): Promise<UserEntity[]> {
    return this.userService.findAll();
  }
}

4.编写user.module.ts

图例:

nestjs 如何映射 已有的表 nestjs数据库_nestjs 如何映射 已有的表_06


代码:

import { Module } from '@nestjs/common';
import { UserController } from './user.controller';
import { UserService } from './user.service';
import { TypeOrmModule } from '@nestjs/typeorm';
import { UserEntity } from '../entities/user.entity';

@Module({
  imports:[TypeOrmModule.forFeature([UserEntity])],
  controllers: [UserController],
  providers: [UserService],
})
export class UserModule {}
注意:每一个Entity文件都必须在其对应的子模块中imports导入并使用TypeOrmModule.forFeature([])注册。

5.编写app.module.ts

图例:

nestjs 如何映射 已有的表 nestjs数据库_数据库_07

代码:

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';

// 子模块加载
import { UserModule } from './user/user.module';

@Module({
  imports: [
    // 加载连接数据库
    TypeOrmModule.forRoot({
      type: 'mysql', // 数据库类型
      host: 'localhost', // 数据库ip地址
      port: 3306, // 端口
      username: 'root', // 登录名
      password: '123456', // 密码
      database: 'nest_study', // 数据库名称
      entities: [__dirname + '/**/*.entity{.ts,.js}'], // 扫描本项目中.entity.ts或者.entity.js的文件
      synchronize: true, // 定义数据库表结构与实体类字段同步(这里一旦数据库少了字段就会自动加入,根据需要来使用)
    }),
    // 加载子模块
    UserModule,
  ],
})
export class AppModule {}

这里主要做了数据库连接配置TypeOrmModule.forRoot()以及子模块的加载注册。
之后便可以启动了。

测试

nestjs 如何映射 已有的表 nestjs数据库_nestjs 如何映射 已有的表_08

补充

1.数据库连接配置外置:

由于个人感觉没太大的必要将这个连接配置外置到一个文件中,因此这里不做说明,但是网上或者官网都有对应的操作方式,查阅即可。

2.连接多个数据库:有三点注意

nestjs 如何映射 已有的表 nestjs数据库_图例_09


1.在app.module.ts中配置多个连接内容,注意都多了个name属性

nestjs 如何映射 已有的表 nestjs数据库_nest连接mysql_10

2.子模块引入时,注明数据库名称

nestjs 如何映射 已有的表 nestjs数据库_数据库_11


3.服务层,使用时@InjectRepository注明数据库名称,