前提
nest.js 本身支持建议使用TypeORM 模块来处理数据库相关的操作,它为许多不同的数据库提供了支持,以 MySQL 为例,使用的官方的hello-world项目做示例
注:本例使用的typeORM因此有许多不懂的相关内容如:@Column、@Entity()、Repository、userRepository.query()
事前准备
首先电脑安装好Mysql数据库
然后通过电脑数据库连接工具测试连接,确定可以连接上(我使用的navicat),之后创建nest-study数据库以及库中的user表如下:
然后在src下面创建一个单独的模块文件夹和entities文件夹,这里以user模块为例,内容现在可以为空。(app.controller.spec.ts这个测试用例文件已删除掉)
建议将所有的entity文件都放置在entities文件夹中,方便管理
安装数据库相关的模块
npm install --save @nestjs/typeorm typeorm mysql
总共三个内容,它们为nest连接数据库以及创造对应的实体类提供了操作与处理
开始实现
1.编写user.entity.ts
图例:
代码:
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
图例:
代码:
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
图例:
代码:
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
图例:
代码:
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
图例:
代码:
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()以及子模块的加载注册。
之后便可以启动了。
测试
补充
1.数据库连接配置外置:
由于个人感觉没太大的必要将这个连接配置外置到一个文件中,因此这里不做说明,但是网上或者官网都有对应的操作方式,查阅即可。
2.连接多个数据库:有三点注意
1.在app.module.ts中配置多个连接内容,注意都多了个name属性
2.子模块引入时,注明数据库名称
3.服务层,使用时@InjectRepository注明数据库名称,