本项目数据持久化的方案选择 mysql 来进行演示
mysql 的安装,启用,配置,已经数据库的创建不在本文考虑范围内
默认已经有一个可以连接的数据库 nest_db, 将以一个 user 表为例展示 typeorm
新建模块
新建 user 模块,我们都放在 logical 下
nest g mo user logical
nest g s user logical --no-spec
nest g co user logical --no-spec
安装依赖包
yarn add @nestjs/typeorm typeorm mysql
新建实体
新建 entities\user\User.entity.ts entity 文件
我们将放在 entities 下 ,以下是一个简单实例,定义四个字段 至于更多的实体文档看这typeorm
import {
Entity,
Column,
PrimaryGeneratedColumn,
CreateDateColumn,
UpdateDateColumn,
} from "typeorm";
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column({ length: 50 })
name: string;
@CreateDateColumn()
create_at: number;
@UpdateDateColumn()
update_at: number;
}
修改 app.module.ts 配置数据库连接
这里就用到了上一篇配置的密码端口号等
import { TypeOrmModule, TypeOrmModuleAsyncOptions } from '@nestjs/typeorm';
// other
@Module({
imports: [
TypeOrmModule.forRootAsync({
imports: [ConfigModule],
inject: [ConfigService],
useFactory: (configService: ConfigService) => {
return {
type: configService.dbType,
host: configService.dbHost,
port: configService.dbPort,
username: configService.dbUser,
password: configService.dbPwd,
database: configService.dbDb,
entities: [User, Auth, Notepad, NotepadType],
synchronize: true,
} as TypeOrmModuleAsyncOptions;
},
}),
ConfigModule,
UserModule,
],
controllers: [AppController],
providers: [AppService],
})
//other
/logical/user/user.controller.ts
新增一个路由,让 service 处理数据
import { Controller, Get } from '@nestjs/common';
import { UserService } from './user.service';
@Controller('user')
export class UserController {
constructor(private readonly userService: UserService) {}
/**
* 获取账号列表
*/
@Get()
async getList() {
// 参数将再此获取,并调用具体逻辑处理代码,然后处理返回
return this.userService.getList();
}
}
/logical/user/user.module.ts
此处仅仅联系了实体和 service、controller
import { Module } from "@nestjs/common";
import { UserService } from "./user.service";
import { UserController } from "./user.controller";
import { TypeOrmModule } from "@nestjs/typeorm";
import { User } from "src/entities/user/User.entity";
@Module({
imports: [TypeOrmModule.forFeature([User])],
providers: [UserService],
controllers: [UserController],
exports: [UserService],
})
export class UserModule {}
/logical/user/user.service.ts
演示了 typeorm 查询能力 querybuild
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { User } from 'src/entities/user/User.entity';
import { Repository } from 'typeorm';
@Injectable()
export class UserService {
constructor(
@InjectRepository(User)
private userRepository: Repository<User>,
) {}
/**
* 账号列表业务逻辑处理
*/
async getList(): Promise<any> {
// QueryBuilder是 TypeORM 最强大的功能之一 ,它允许你使用优雅便捷的语法构建 SQL 查询,执行并获得自动转换的实体
const qb = this.userRepository.createQueryBuilder('user');
const data = await qb.getMany();
return data;
}
}
总结
仅需上述几个步骤,我们就实现了一个查询所有用户的接口,至于更多的关于 typeorm 相关的 api,肯定是需要查考文档的,它同样可以写原生的 sql,但一般而言,typeorm 提供的 api 已经足够使用,并且因为本质仍然是 sql,你也可以使用 getSql 获取生成的 sql 查询语句