当前位置: 首页 > 科技观察

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

时间:2023-03-17 14:07:59 科技观察

写的比较早。在上一篇《【前端】嘿,Nest.js实战开发系列 01 ── Nest.js初体验》中,我介绍了如何开始使用nest.js,也详细介绍了如何创建项目、路由访问和Createmodules,这些都是项目实践的基础。随着项目的推进,我们要考虑如何实现数据库的连接和使用,可以用来实现前后端数据交互的数据存储。环境准备:Mysql5.7TypeORM0.2.34TypeORM集成可以使用Nest.js中的任意数据库,内部集成提供了TypeORM和Sequelize,开箱即用的@nestjs/typeorm和@nestjs/sequelize包。Nest使用TypeORM,因为它是可用于TypeScript的最成熟的对象关系映射器(ORM)。由于它是用TypeScript编写的,因此可以很好地与Nest框架集成。要开始使用它,我们首先安装所需的依赖项。在命令行中输入:$npminstall--save@nestjs/typeormtypeormmysql2安装完成后,可以将TypeOrmModule导入根目录AppModule中。app.module.tsimport{Module}from'@nestjs/common';import{TypeOrmModule}from'@nestjs/typeorm';@Module({imports:[TypeOrmModule.forRoot({type:'mysql',host:'localhost',port:3306,username:'root',password:'root',database:'test',entities:[],synchronize:true,}),],})exportclassAppModule{}记住: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。tsimport{Module}from'@nestjs/common';import{TypeOrmModule}from'@nestjs/typeorm';@Module({imports:[TypeOrmModule.forRoot()],})exportclassAppModule{}注意:静态glob路径(例如,dist/**/*.entity{.ts,.js})将无法与webpack一起正常工作。实际上,ormconfig.json文件是由typeorm库加载的,因此不会应用其他属性设置。TypeORM提供了getConnectionOptions函数来从ormconfig文件或环境变量中读取连接选项。完成上述操作后,TypeORMConnection和EntityManager对象将可用于在整个项目中注入(无需导入任何模块)。app.module.tsimport{TypeOrmModule}from'@nestjs/typeorm';import{Connection}from"typeorm";import{UsersModule}from'./users/users.module';@Module({imports:[TypeOrmModule.forRoot(),UsersModule],controllers:[AppController],providers:[AppService],})exportclassAppModule{constructor(privateconnection:Connection){}}RepositorypatternTypeORM支持repository设计模式,因此每个实体都有自己的存储库。这些存储库可从数据库连接获得。下面创建一个用户实体,users.entity.ts在users目录下,users.entity.tsimport{Entity,PrimaryGeneratedColumn,Column,BeforeInsert,JoinTable,ManyToMany,OneToMany}from'typeorm';import{IsEmail}from'class-验证器';导入*asargon2from'argon2';导入{ArticleEntity}from'../article/article.entity';@Entity('user')exportclassUserEntity{@PrimaryGeneratedColumn()id:number;@Column()username:string;@Column()@IsEmail()email:string;@Column({default:''})bio:string;@Column({default:''})image:string;@Column()password:string;@BeforeInsert()asynchashPassword(){this.password=awaitargon2.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.tsimport{Module}from'@nestjs/common';import{UsersController}from'./users.controller';import{UsersService}from'./users.service';import{UsersEntity}from"./users.entity";import{TypeOrmModule}from'@nestjs/typeorm';@Module({imports:[TypeOrmModule.forFeature([UsersEntity])],提供者:[UsersService],控制器:[UsersController],出口:[UsersService]})exportclassUsersModule{}该模块使用forFeature()来定义哪些存储库在当前范围内注册。这时可以使用Decorator将UsersRepository注入`UsersService@InjectRepository().users.service.tsimport{Get,Post,Body,Put,Delete,Query,Param,Controller}from'@nestjs/common';import{UsersService}from'./users.service';@Controller('user')exportclassUsersController{constructor(privatereadonlyusersService:UsersService){}//查找指定用户@Get("find/:id")asyncfindById(@Query("id")id:number){returnthis.usersService.findById(id);}}数据表之间的关系是在两个或多个表之间建立的关联是根据每个表的公共字段,通常是主键和外键。数据表之间存在三种关系:因此,可以使用相应的装饰器来定义实体中的关系。测试代码users.controller.tsimport{Get,Post,Body,Put,Delete,Query,Param,Controller}from'@nestjs/common';import{UsersService}from'./users.service';@Controller('user')exportclassUsersController{constructor(privatereadonlyusersService:UsersService){}//查找指定用户@Get("find/:id")asyncfindById(@Query("id")id:number){returnthis.usersService.findById(id);当我们运行代码时,数据库会自动生成用户表。而当我们在postman中向服务器请求指定id的用户信息时,请求结果如下:后台显示结果如下:我们看到上面的代码测试是正确的。总结本文介绍了mysql和typeorm的关系,typeorm的配置,nest如何通过typeorm连接数据库,简单的用户表数据查询。其实笔者之前用过Sequelize,现在想试试typeorm和nest的结合,所以文章有点乱。我建议你查看官方文件:《Nest官方文档》和?