文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2024-12-03 03:07

关注

环境准备:

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.  
  4. @Module({ 
  5.   imports: [ 
  6.     TypeOrmModule.forRoot({ 
  7.       type: 'mysql'
  8.       host: 'localhost'
  9.       port: 3306, 
  10.       username: 'root'
  11.       password'root'
  12.       database'test'
  13.       entities: [], 
  14.       synchronize: true
  15.     }), 
  16.   ], 
  17. }) 
  18. export class AppModule {} 

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

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

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

ormconfig.json

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

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

app.module.ts

  1. import { Module } from '@nestjs/common'
  2. import { TypeOrmModule } from '@nestjs/typeorm'
  3.  
  4. @Module({ 
  5.   imports: [TypeOrmModule.forRoot()], 
  6. }) 
  7. 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.  
  5.  
  6. @Module({ 
  7.   imports: [ 
  8.     TypeOrmModule.forRoot(), 
  9.     UsersModule 
  10.   ], 
  11.   controllers: [AppController], 
  12.   providers: [AppService], 
  13. }) 
  14. export class AppModule { 
  15.   constructor(private connectionConnection){} 

存储库模式

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.  
  6. @Entity('user'
  7. export class UserEntity { 
  8.  
  9.   @PrimaryGeneratedColumn() 
  10.   id: number; 
  11.  
  12.   @Column() 
  13.   username: string; 
  14.  
  15.   @Column() 
  16.   @IsEmail() 
  17.   email: string; 
  18.  
  19.   @Column({default''}) 
  20.   bio: string; 
  21.  
  22.   @Column({default''}) 
  23.   image: string; 
  24.  
  25.   @Column() 
  26.   password: string; 
  27.  
  28.   @BeforeInsert() 
  29.   async hashPassword() { 
  30.     this.password = await argon2.hash(this.password); 
  31.   } 
  32.  
  33.   @ManyToMany(type => ArticleEntity) 
  34.   @JoinTable() 
  35.   favorites: ArticleEntity[]; 
  36.  
  37.   @OneToMany(type => ArticleEntity, article => article.author) 
  38.   articles: ArticleEntity[]; 

现在开始使用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.  
  4. @Controller('user'
  5. export class UsersController { 
  6.   constructor(private readonly usersService: UsersService){} 
  7.  
  8.   // 查找指定用户 
  9.   @Get("find/:id"
  10.   async findById(@Query("id") id: number){ 
  11.     return this.usersService.findById(id); 
  12.      
  13.   } 

数据表间的关系

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

数据表之间有三种关系:

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

测试代码

users.controller.ts

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

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

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

后台显示结果如下:

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

小结

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

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

 

来源:前端万有引力内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯