前端 | 嘿,Nest.js实战开发系列之使用TypeORM操作数据库

网友投稿 1503 2023-05-31

前端 | 嘿,Nest.js实战开发系列之使用TypeORM操作数据库

前端 | 嘿,Nest.js实战开发系列之使用TypeORM操作数据库

写在前面

在上一篇文章《【前端】嘿,Nest.js实战开发系列 01 ── Nest.js初体验》中介绍了如何上手nest.js,同时详细介绍了如何进行项目创建、路由访问和创建模块,这些都是项目实践的基础。随着项目的推进,我们就要考虑如何实现数据库的连接和使用,这样可以用来实现前后端数据交互的数据存储

环境准备:

Mysql 5.7TypeORM 0.2.34

TypeORM集成

在Nest.js中可以使用任意数据库,且内部集成提供了TypeORM 和 Sequelize ,开箱即用@nestjs/typeorm和@nestjs/sequelize包。Nest 使用TypeORM,因为它是可用于 TypeScript 的最成熟的对象关系映射器 (ORM)。由于它是用 TypeScript 编写的,因此它可以很好地与 Nest 框架集成。

要开始使用它,我们首先安装所需的依赖项。在命令行中输入:

$ npm install --save @nestjs/typeorm typeorm mysql2

安装完毕后,可以将TypeOrmModule导入根目录AppModule。

app.module.ts

切记:synchronize: true不应在生产中使用设置- 否则您可能会丢失生产数据。

该forRoot()方法支持TypeORM包中的createConnection()函数公开的所有配置属性。此外,还有几个额外的配置属性如下所述。

当然,也可以在根目录下创建ormconfig.json文件,在文件中进行数据库信息的设置。

ormconfig.json

{   "type": "mysql",   "host": "localhost",   "port": 3306,   "username": "root",   "password": "root",   "database": "test",   "entities": ["dist/**/*.entity{.ts,.js}"],   "synchronize": true }

然后,我们可以在forRoot()没有任何选项的情况下调用:

app.module.ts

注意:静态 glob 路径(例如,dist/**/*.entity{ .ts,.js})将无法与webpack正常工作。

其实,ormconfig.json文件是由typeorm库加载的,因此不会应用额外的属性设置。TypeORM 提供了getConnectionOptions从ormconfig文件或环境变量中读取连接选项的函数。

完成以上操作后,TypeORMConnection和EntityManager对象将可用于在整个项目中注入(无需导入任何模块)。

app.module.ts

import { TypeOrmModule } from '@nestjs/typeorm'; import { Connection } from "typeorm"; import { UsersModule } from './users/users.module';   @Module({   imports: [     TypeOrmModule.forRoot(),     UsersModule   ],   controllers: [AppController],   providers: [AppService], }) export class AppModule {   constructor(private connection: Connection){} }

存储库模式

TypeORM支持存储库设计模式,因此每个实体都有自己的存储库。这些存储库可以从数据库连接中获得。

下面创建一个用户实体,users.entity.ts在users目录下,

users.entity.ts

import {Entity, PrimaryGeneratedColumn, Column, BeforeInsert, JoinTable, ManyToMany, OneToMany} from 'typeorm'; import { IsEmail } from 'class-validator'; import * as argon2 from 'argon2'; import { ArticleEntity } from '../article/article.entity';  @Entity('user') export class UserEntity {    @PrimaryGeneratedColumn()   id: number;    @Column()   username: string;    @Column()   @IsEmail()   email: string;    @Column({default: ''})   bio: string;    @Column({default: ''})   image: string;    @Column()   password: string;    @BeforeInsert()   async hashPassword() {     this.password = await argon2.hash(this.password);   }    @ManyToMany(type => ArticleEntity)   @JoinTable()   favorites: ArticleEntity[];    @OneToMany(type => ArticleEntity, article => article.author)   articles: ArticleEntity[]; }

现在开始使用Users实体,只需要在users.module.ts文件中通过entities模块forFeature()方法选项中的数组来进行导入。

users.module.ts

此模块使用forFeature()来定义在当前范围内注册了那些存储库,此时将可以使用装饰器将UsersRepository注入到`UsersService @InjectRepository().

users.service.ts

数据表间的关系

关系是在两个或多个表之间建立的关联,是基于每张表的公共字段,通常是主键和外键。

数据表之间有三种关系:

因此,在实体中定义关系可以使用相应的装饰器。

测试代码

users.controller.ts

当我们运行代码时,数据库自动生成了users表。

而当我们在postman向服务器请求指定id的用户信息时,请求结果如下所示:

后台显示结果如下:

我们看到以上代码测试是正确的。

小结

本篇文章介绍了mysql和typeorm之间的关系,typeorm的配置,nest是如何通过typeorm连接数据库,以及简单的用户表数据查询。

其实笔者之前也用过 Sequelize ,现在想要尝试typeorm和nest的搭配,所以文章写的有些乱,建议诸位多加查看官方文档:《Nest官方文档》和《Typeorm官方文档》

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:是什么影响了 MySQL 的性能?
下一篇:10+款Redis容器化技术选型对比,K8S并非万金油
相关文章