• 首页
  • 国产小呦泬泬99精品
  • 最近2019中文字幕在线高清
  • 免费看少妇作爱视频
  • 曰批全过程免费视频在线观看网站
  • 国色天香在线观看全集免费播放
  • 婆岳同床双飞呻吟
  • 婆岳同床双飞呻吟你的位置:三级小说 > 婆岳同床双飞呻吟 > Nest.js 快速初学:扫尾对 MySQL 单表的 Crud

    Nest.js 快速初学:扫尾对 MySQL 单表的 Crud

    发布日期:2022-06-18 17:11    点击次数:161

    Nest.js 快速初学:扫尾对 MySQL 单表的 Crud

    Nest.js 是一个 Node.js 的后端开拓框架,它扫尾了 MVC 模式,也撑持了 IOC(自动注入依赖),比 Express 这类处理肯求反应的库高了一个头绪。而且也很容易集成 GraphQL、WebSocket 等功能,适应用来做大畛域企业级开拓。

    Nest.js 在国表里用的都挺多的,今天咱们就来初学下吧:做一个笔记管束功能,扫尾对 mysql 单表的增改革查并提供 Restful 的接口。

    背面要先容的本色比拟多,咱们先来看下最终的成果吧:

    视频

    完满代码上传了 github:https://github.com/QuarkGluonPlasma/nestjs-exercize

    Nest.js + Typeorm 基础 mysql 数据库和 Typeorm

    当先从离前端比拟远的数据库讲起。

    在 mysql 的官网下载 mysql,安设并启动服务。

    这技术就不错用高歌行来写 sql 操作数据库了。

    关联词高歌行操作不够便捷,是以咱们还要下载一个有界面的 mysql 客户端,我这里用的是 navicat。

    它不错可视化的创建数据库、表等,不错在剪辑器里写 sql 然后履行。比如图中我创建了 hello 的数据库和一堆表。

    Node.js 代码里一样不错诱骗上数据库服务,然后云尔履行 sql 来对数据库表做增改革查。

    但径直履行 sql 比拟繁琐,能不行我只操作对象,对象属性变了就自动去履行 sql 来同步数据库呢?就像 vue 的数据变了自动同步视图一样。

    数据库和对象关系的映射就叫做 ORM(Object Relational Mapping),也便是把表映射成对象,把表与表之间的关联映射成对象之间的关系。之后对对象的操作和会过 sql 同步到数据库。

    Typeorm 便是一个扫尾 orm 的框架,不错通过讳饰器来形貌映射关系,比如 @Entity(实体)、@Column(列)、@PrimaryGeneratedColumn(主键 ID 自动生成)

    import { Entity, PrimaryGeneratedColumn, Column } from "typeorm";  @Entity() export class Note{      @PrimaryGeneratedColumn()     id: number;      @Column()     title: string;      @Column()     content: string; } 

    通过讳饰器声明了关系,那么在成立了数据库诱骗之后,咱们只需要操作对象,Typeorm 就会自动去履行 sql 来把变动同步到数据库。

    这样,咱们对数据库的表的操作和增改革查就扫尾了。

    数据库部分惩办之后,咱们再往前看一下处理肯求的部分。

    http 请乞降 Nest.js

    处理肯求的后端框架咱们使用 Nest.js,它提供了 Controller、Service 等差异,这是对 MVC 模式的扫尾。

    Controller 内部闲逸处理肯求,把处理过的参数传递给 service。

    Service 闲逸业务逻辑的扫尾,基于 Typeorm 的增改革查功能来扫尾各式表层业务逻辑。

    除此除外,Nest.js 还差异了 Module,这个 Module 是逻辑上的模块,和咱们常说的文献对应的模块不同,它包含了 Controller、Service 等,是对这些资源的逻辑差异。

    Module 和 Module 之间还不错有依赖关系,也就有 imports 和 exports。

    是以,模块的声明便是这样的:

    import { Module } from '@nestjs/common';  @Module({   imports: [AaaModule],   controllers: [BbbController],   providers: [BbbService],   exports: [BbbService] }) export class BbbModule {} 

    这里通过 @Module 的讳饰器来声明了 Bbb 的模块,它依赖了 Aaa 模块,也便是在 imports 引入的 AaaModule。controllers 是截止器,包含 BbbController,providers 是提供商, 天天躁日日躁狠狠躁日日躁黑人有 service、factory 等类型,这里包含 BbbService,同期,还导出了 BbbService 不错被其他模块引入。

    Controller 的声明亦然通过讳饰器:

    @Controller() export class BbbController { } 

    Service 的声明亦然用讳饰器,只不外不叫 Service,而叫 Injectable。

    @Injectable() export class BbbService { } 

    至于为什么叫 Injectable,就波及到了 IOC 的见地了。

    IOC(Inverse Of Control)是截止回转的道理,便是只需要声明你的依赖,不需要创建依赖的对象,容器会注入给你。

    因为系数的对象都是由容器管束的,那么当然就不错在创建对象的技术注入它需要的依赖,这便是 IOC 的道理。

    Service 是不错被看成依赖注入到其他类的实例中去的,是以用 Injectable 讳饰器。

    系数的 Module 会有一个根 Module 看成进口,启动 IOC 容器便是从这个模块初始的:

    import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; import "reflect-metadata";  async function bootstrap() {   const app = await NestFactory.create(AppModule);   await app.listen(3000); } bootstrap(); 

    上头便是典型的 Nest.js 启动代码,从 AppModule 这个根 Module 初创举建 IOC 容器,处理从 3000 端口发过来的肯求。

    reflect-metadata 模块是用于判辨类的讳饰器的,因为要给某个类的实例注入依赖就得能判辨出它通过讳饰器声明了哪些依赖,然后注入给它。是以要扫尾 IOC 需要依赖这个包。

    这便是 Nest.js 约略的缠绵了:IOC + MVC,通过 IOC 容器来管束对象的依赖关系,通过 Controller、Service、Module 来做处事上的差异。

    Nest.js 结合 Typeorm

    Typeorm 是做把对象的操作通过 sql 同步为对数据库操作的 orm 的,而 Nest.js 是做 Web 后端诈骗的 MVC 分层以及通过 IOC 管束对象的创建和依赖的。这俩很当然的不错结合,结合的样貌便是 @nestjs/typeorm 包。

    @nestjs/typeorm 包提供了 TypeOrmModule 这个 Module,婆岳同床双飞呻吟它有两个静态行径 forRoot、forFeature。

    forRoot 用于创建数据库诱骗,传入一些配置参数,在进口 Module 引入。

    @Module({   imports: [     TypeOrmModule.forRoot({       type: 'mysql',       host: 'localhost',       port: 3306,       username: 'root',       password: '你的密码',       database: '数据库名',       synchronize: true     }),     NotesModule   ] }) export class AppModule {} 

    forFeature 用于创建不同实体类对应的 Repository,在用到该实体的 Module 里引入。

    @Module({   imports: [TypeOrmModule.forFeature([Aaa])],   controllers: [AaaController],   providers: [AaaService],   exports: [AaaService] }) export class AaaModule {} 

    咱们显露了 Typeorm 和 Nest.js 都是做什么的和怎样用,浅显小结一下:

    Typeorm 是 ORM 框架,用于把对象的操作同步为对数据库的操作,会自动履行 sql 语句。

    Nest.js 是 MVC 框架,用于 Web 后端诈骗的逻辑分层,还提供了 Module 用来进一步差异 Controller 和 Service。此外,Nest.js 提供了 IOC 容器,妥洽管束对象的创建和依赖关系,证实声明来自动注入依赖。

    两者的结合便是通过 @nestjs/typeorm 的包,它有两个静态行径用于生成 Module。

    说了这样多,环球可能还通晓的不是很明晰,那么咱们就来做动笔记管束的实战案例吧。

    实战案例

    Nest.js 样板代码比拟多,我方写真旧比拟费劲的,@nestjs/cli 的高歌行用具对这些做了自动化。

    当先要搭花式标骨架,用

    nest new project-name 

    然青年景某个 Module 的代码

    nest g resource xxx 

    生成的代码便是带有 Controller、Service、Module 的,而且也有了 CRUD 的样板代码。

    咱们重心来看下 Controller 的代码:

    import { Controller, Get, Post, Body, Patch, Param, Delete } from '@nestjs/common'; import { XxxService } from './xxx.service'; import { CreateXxxDto } from './dto/create-xxx.dto'; import { UpdateXxxDto } from './dto/update-xxx.dto';  @Controller('xxx') export class XxxController {   constructor(private readonly xxxService: XxxService) {}    @Post()   create(@Body() createXxxDto: CreateXxxDto) {     return this.xxxService.create(createXxxDto);   }    @Get()   findAll() {     return this.xxxService.findAll();   }    @Get(':id')   findOne(@Param('id') id: string) {     return this.xxxService.findOne(+id);   }    @Patch(':id')   update(@Param('id') id: string, @Body() updateXxxDto: UpdateXxxDto) {     return this.xxxService.update(+id, updateXxxDto);   }    @Delete(':id')   remove(@Param('id') id: string) {     return this.xxxService.remove(+id);   } } 

    @Controller 的参数不错声明 URL 旅途,@Get、@Post、@Patch、@Delete 也不错通过参数声明 URL 旅途,最终会把两个拼起来。比如 /xxx/:id 的 get 行径。

    @Get、@Post、@Patch、@Delete 分别对应不同的肯求样貌。

    @Param 是取旅途中的参数,@Query 是取查询字符串的参数。

    @Body 是把肯求参数建树到对象的属性上,被用来传递数据的对象叫做 dto(data transfer object)。

    再便是复返的对象会被序列化成 JSON,不需要手动序列化。

    然后再看下 Service:

    import { Injectable } from '@nestjs/common'; import { CreateXxxDto } from './dto/create-xxx.dto'; import { UpdateXxxDto } from './dto/update-xxx.dto';  @Injectable() export class XxxService {   create(createXxxDto: CreateXxxDto) {     return 'This action adds a new xxx';   }    findAll() {     return `This action returns all xxx`;   }    findOne(id: number) {     return `This action returns a #${id} xxx`;   }    update(id: number, updateXxxDto: UpdateXxxDto) {     return `This action updates a #${id} xxx`;   }    remove(id: number) {     return `This action removes a #${id} xxx`;   } } 

    这些 service 的行径都莫得具体扫尾。

    咱们引入 Typeorm 来做数据库的 CRUD。

    在根模块引入用于数据库诱骗的 Module

    在刚创建的模块引入实体对应的 Module:

    创建笔记实体,用 @Entity 记号。而且用 @Column、@PrimaryGeneratedColumn 来记号列和主键。

    import { Entity, PrimaryGeneratedColumn, Column } from "typeorm";  @Entity() export class Note{      @PrimaryGeneratedColumn()     id: number;      @Column()     title: string;      @Column()     content: string;      @Column()     createTime: Date;      @Column()     updateTime: Date;      @Column()     isDelete: boolean; } 

    之后在 service 里注入实体对应的操作类 Repository,就不错扫尾对笔记的增改革查了。

    用到的 dto 便是参数对应的对象,他们是实体的一部分属性的聚拢。比如 update dto:

    export class UpdateNoteDto {     title: string;      content: string;      createTime: Date;      updateTime: Date;      isDelete: boolean; } 

    这样,就扫尾了对笔记的增改革查。

    咱们用 postman 来测试下成果:

    运行 npm start 把花式跑起来

    不错看到 4 个接口的路由映射都收效了。

    数据库一初始有两笔纪录:

    通过查询接口能正确的查出来:

    然后测试下修改接口:

    数据库中如实被修改了:

    经由测试,对笔记单表的 CRUD 的功能广漠。

    视频

    咱们完成了第一个 Nest.js 的后端诈骗!

    完满代码上传了 github:https://github.com/QuarkGluonPlasma/nestjs-exercize

    追思

    Typeorm 是一个 ORM 框架,通过映射表和对象的对应关系,就不错把对对象的操作营救为对数据库的操作,自动履行 sql 语句。

    Nest.js 是一个 MVC 框架,提供了 Module、Controller、Service 的逻辑差异,也扫尾了 IOC 模式,聚合管束对象和自动注入依赖。

    Typeorm 和 Nest.js 的结合使用 @nestjs/typeorm 的包,它提供了一个 TypeormModule 的模块,有 forRoot 和 forFeature 两个静态行径。forRoot 行径用于生成诱骗数据库的 Module,forFeature 用于生成实体对应的 Repository 的 Module。

    Nest.js 有很各类板代码,不错用 @nestjs/cli 的高歌行用具生成,包括举座的和每个 Module 的。

     

    总之,通晓了 IOC,通晓了 Module、Controller、Service 的差异,就算是初步独揽了 Nest.js,结合 Typeorm 的 ORM 框架不错讲理的做数据库表的 CRUD。

     



    Powered by 三级小说 @2013-2022 RSS地图 HTML地图