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

写在前面

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

创新互联公司成都企业网站建设服务,提供成都做网站、成都网站设计网站开发,网站定制,建网站,网站搭建,网站设计,自适应网站建设,网页设计师打造企业风格网站,提供周到的售前咨询和贴心的售后服务。欢迎咨询做网站需要多少钱:028-86922220

环境准备:

  • Mysql 5.7
  • TypeORM 0.2.34

TypeORM集成

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

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

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

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

app.module.ts

 
 
 
 
  1. import { Module } from '@nestjs/common';
  2. import { TypeOrmModule } from '@nestjs/typeorm';
  3. @Module({
  4.   imports: [
  5.     TypeOrmModule.forRoot({
  6.       type: 'mysql',
  7.       host: 'localhost',
  8.       port: 3306,
  9.       username: 'root',
  10.       password: 'root',
  11.       database: 'test',
  12.       entities: [],
  13.       synchronize: true,
  14.     }),
  15.   ],
  16. })
  17. export class AppModule {}

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

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

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

ormconfig.json

 
 
 
 
  1. {
  2.   "type": "mysql",
  3.   "host": "localhost",
  4.   "port": 3306,
  5.   "username": "root",
  6.   "password": "root",
  7.   "database": "test",
  8.   "entities": ["dist/**/*.entity{.ts,.js}"],
  9.   "synchronize": true
  10. }

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

app.module.ts

 
 
 
 
  1. import { Module } from '@nestjs/common';
  2. import { TypeOrmModule } from '@nestjs/typeorm';
  3. @Module({
  4.   imports: [TypeOrmModule.forRoot()],
  5. })
  6. export class AppModule {}

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

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

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

app.module.ts

 
 
 
 
  1. import { TypeOrmModule } from '@nestjs/typeorm';
  2. import { Connection } from "typeorm";
  3. import { UsersModule } from './users/users.module';
  4. @Module({
  5.   imports: [
  6.     TypeOrmModule.forRoot(),
  7.     UsersModule
  8.   ],
  9.   controllers: [AppController],
  10.   providers: [AppService],
  11. })
  12. export class AppModule {
  13.   constructor(private connection: Connection){}
  14. }

存储库模式

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

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

users.entity.ts

 
 
 
 
  1. import {Entity, PrimaryGeneratedColumn, Column, BeforeInsert, JoinTable, ManyToMany, OneToMany} from 'typeorm';
  2. import { IsEmail } from 'class-validator';
  3. import * as argon2 from 'argon2';
  4. import { ArticleEntity } from '../article/article.entity';
  5. @Entity('user')
  6. export class UserEntity {
  7.   @PrimaryGeneratedColumn()
  8.   id: number;
  9.   @Column()
  10.   username: string;
  11.   @Column()
  12.   @IsEmail()
  13.   email: string;
  14.   @Column({default: ''})
  15.   bio: string;
  16.   @Column({default: ''})
  17.   image: string;
  18.   @Column()
  19.   password: string;
  20.   @BeforeInsert()
  21.   async hashPassword() {
  22.     this.password = await argon2.hash(this.password);
  23.   }
  24.   @ManyToMany(type => ArticleEntity)
  25.   @JoinTable()
  26.   favorites: ArticleEntity[];
  27.   @OneToMany(type => ArticleEntity, article => article.author)
  28.   articles: ArticleEntity[];
  29. }

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

users.module.ts

 
 
 
 
  1. import { Module } from '@nestjs/common';
  2. import { UsersController } from './users.controller';
  3. import { UsersService } from './users.service';
  4. import {UsersEntity} from "./users.entity";
  5. import { TypeOrmModule } from '@nestjs/typeorm';
  6. @Module({
  7.   imports: [TypeOrmModule.forFeature([UsersEntity])],
  8.   providers: [UsersService],
  9.   controllers: [
  10.     UsersController
  11.   ],
  12.   exports: [UsersService]
  13. })
  14. export class UsersModule {}

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

users.service.ts

 
 
 
 
  1. import {Get, Post, Body, Put, Delete, Query, Param, Controller} from '@nestjs/common';
  2. import { UsersService } from './users.service';
  3. @Controller('user')
  4. export class UsersController {
  5.   constructor(private readonly usersService: UsersService){}
  6.   // 查找指定用户
  7.   @Get("find/:id")
  8.   async findById(@Query("id") id: number){
  9.     return this.usersService.findById(id);
  10.     
  11.   }
  12. }

数据表间的关系

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

数据表之间有三种关系:

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

测试代码

users.controller.ts

 
 
 
 
  1. import {Get, Post, Body, Put, Delete, Query, Param, Controller} from '@nestjs/common';
  2. import { UsersService } from './users.service';
  3. @Controller('user')
  4. export class UsersController {
  5.   constructor(private readonly usersService: UsersService){}
  6.   // 查找指定用户
  7.   @Get("find/:id")
  8.   async findById(@Query("id") id: number){
  9.     return this.usersService.findById(id);
  10.     
  11.   }

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

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

后台显示结果如下:

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

小结

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

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

网站栏目:前端|嘿,Nest.js实战开发系列之使用TypeORM操作数据库
当前地址:http://www.shufengxianlan.com/qtweb/news38/60288.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联