国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Nest.js 快速入門:實(shí)現(xiàn)對 MySQL 單表的 Crud

數(shù)據(jù)庫 MySQL
Typeorm 是一個(gè) ORM 框架,通過映射表和對象的對應(yīng)關(guān)系,就可以把對對象的操作轉(zhuǎn)換為對數(shù)據(jù)庫的操作,自動執(zhí)行 sql 語句。

[[441489]]

Nest.js 是一個(gè) Node.js 的后端開發(fā)框架,它實(shí)現(xiàn)了 MVC 模式,也支持了 IOC(自動注入依賴),比 Express 這類處理請求響應(yīng)的庫高了一個(gè)層次。而且也很容易集成 GraphQL、WebSocket 等功能,適合用來做大規(guī)模企業(yè)級開發(fā)。

Nest.js 在國內(nèi)外用的都挺多的,今天我們就來入門下吧:做一個(gè)筆記管理功能,實(shí)現(xiàn)對 mysql 單表的增刪改查并提供 Restful 的接口。

后面要介紹的內(nèi)容比較多,我們先來看下最終的效果吧:

視頻

完整代碼上傳了 github:https://github.com/QuarkGluonPlasma/nestjs-exercize

Nest.js + Typeorm 基礎(chǔ)

mysql 數(shù)據(jù)庫和 Typeorm

首先從離前端比較遠(yuǎn)的數(shù)據(jù)庫講起。

在 mysql 的官網(wǎng)下載 mysql,安裝并啟動服務(wù)。

這時(shí)候就可以用命令行來寫 sql 操作數(shù)據(jù)庫了。

但是命令行操作不夠方便,所以我們還要下載一個(gè)有界面的 mysql 客戶端,我這里用的是 navicat。

它可以可視化的創(chuàng)建數(shù)據(jù)庫、表等,可以在編輯器里寫 sql 然后執(zhí)行。比如圖中我創(chuàng)建了 hello 的數(shù)據(jù)庫和一堆表。

Node.js 代碼里同樣可以連接上數(shù)據(jù)庫服務(wù),然后遠(yuǎn)程執(zhí)行 sql 來對數(shù)據(jù)庫表做增刪改查。

但直接執(zhí)行 sql 比較繁瑣,能不能我只操作對象,對象屬性變了就自動去執(zhí)行 sql 來同步數(shù)據(jù)庫呢?就像 vue 的數(shù)據(jù)變了自動同步視圖一樣。

數(shù)據(jù)庫和對象關(guān)系的映射就叫做 ORM(Object Relational Mapping),也就是把表映射成對象,把表與表之間的關(guān)聯(lián)映射成對象之間的關(guān)系。之后對對象的操作會通過 sql 同步到數(shù)據(jù)庫。

Typeorm 就是一個(gè)實(shí)現(xiàn) orm 的框架,可以通過裝飾器來描述映射關(guān)系,比如 @Entity(實(shí)體)、@Column(列)、@PrimaryGeneratedColumn(主鍵 ID 自動生成)

  1. import { Entity, PrimaryGeneratedColumn, Column } from "typeorm"
  2.  
  3. @Entity() 
  4. export class Note{ 
  5.  
  6.     @PrimaryGeneratedColumn() 
  7.     id: number; 
  8.  
  9.     @Column() 
  10.     title: string; 
  11.  
  12.     @Column() 
  13.     content: string; 

通過裝飾器聲明了關(guān)系,那么在建立了數(shù)據(jù)庫連接之后,我們只需要操作對象,Typeorm 就會自動去執(zhí)行 sql 來把變動同步到數(shù)據(jù)庫。

這樣,我們對數(shù)據(jù)庫的表的操作和增刪改查就實(shí)現(xiàn)了。

數(shù)據(jù)庫部分搞定之后,我們再往前看一下處理請求的部分。

http 請求和 Nest.js

處理請求的后端框架我們使用 Nest.js,它提供了 Controller、Service 等劃分,這是對 MVC 模式的實(shí)現(xiàn)。

Controller 里面負(fù)責(zé)處理請求,把處理過的參數(shù)傳遞給 service。

Service 負(fù)責(zé)業(yè)務(wù)邏輯的實(shí)現(xiàn),基于 Typeorm 的增刪改查功能來實(shí)現(xiàn)各種上層業(yè)務(wù)邏輯。

除此以外,Nest.js 還劃分了 Module,這個(gè) Module 是邏輯上的模塊,和我們常說的文件對應(yīng)的模塊不同,它包含了 Controller、Service 等,是對這些資源的邏輯劃分。

Module 和 Module 之間還可以有依賴關(guān)系,也就有 imports 和 exports。

所以,模塊的聲明就是這樣的:

  1. import { Module } from '@nestjs/common'
  2.  
  3. @Module({ 
  4.   imports: [AaaModule], 
  5.   controllers: [BbbController], 
  6.   providers: [BbbService], 
  7.   exports: [BbbService] 
  8. }) 
  9. export class BbbModule {} 

這里通過 @Module 的裝飾器來聲明了 Bbb 的模塊,它依賴了 Aaa 模塊,也就是在 imports 引入的 AaaModule。controllers 是控制器,包含 BbbController,providers 是提供商,有 service、factory 等類型,這里包含 BbbService,同時(shí),還導(dǎo)出了 BbbService 可以被其他模塊引入。

Controller 的聲明也是通過裝飾器:

  1. @Controller() 
  2. export class BbbController { 

Service 的聲明也是用裝飾器,只不過不叫 Service,而叫 Injectable。

  1. @Injectable() 
  2. export class BbbService { 

至于為什么叫 Injectable,就涉及到了 IOC 的概念了。

IOC(Inverse Of Control)是控制反轉(zhuǎn)的意思,就是只需要聲明你的依賴,不需要?jiǎng)?chuàng)建依賴的對象,容器會注入給你。

因?yàn)樗械膶ο蠖际怯扇萜鞴芾淼模敲醋匀痪涂梢栽趧?chuàng)建對象的時(shí)候注入它需要的依賴,這就是 IOC 的原理。

Service 是可以被作為依賴注入到其他類的實(shí)例中去的,所以用 Injectable 裝飾器。

所有的 Module 會有一個(gè)根 Module 作為入口,啟動 IOC 容器就是從這個(gè)模塊開始的:

  1. import { NestFactory } from '@nestjs/core'
  2. import { AppModule } from './app.module'
  3. import "reflect-metadata"
  4.  
  5. async function bootstrap() { 
  6.   const app = await NestFactory.create(AppModule); 
  7.   await app.listen(3000); 
  8. bootstrap(); 

上面就是典型的 Nest.js 啟動代碼,從 AppModule 這個(gè)根 Module 開始創(chuàng)建 IOC 容器,處理從 3000 端口發(fā)過來的請求。

reflect-metadata 模塊是用于解析類的裝飾器的,因?yàn)橐o某個(gè)類的實(shí)例注入依賴就得能解析出它通過裝飾器聲明了哪些依賴,然后注入給它。所以要實(shí)現(xiàn) IOC 需要依賴這個(gè)包。

這就是 Nest.js 大概的設(shè)計(jì)了:IOC + MVC,通過 IOC 容器來管理對象的依賴關(guān)系,通過 Controller、Service、Module 來做職責(zé)上的劃分。

Nest.js 結(jié)合 Typeorm

Typeorm 是做把對象的操作通過 sql 同步為對數(shù)據(jù)庫操作的 orm 的,而 Nest.js 是做 Web 后端應(yīng)用的 MVC 分層以及通過 IOC 管理對象的創(chuàng)建和依賴的。這倆很自然的可以結(jié)合,結(jié)合的方式就是 @nestjs/typeorm 包。

@nestjs/typeorm 包提供了 TypeOrmModule 這個(gè) Module,它有兩個(gè)靜態(tài)方法 forRoot、forFeature。

forRoot 用于創(chuàng)建數(shù)據(jù)庫連接,傳入一些配置參數(shù),在入口 Module 引入。

  1. @Module({ 
  2.   imports: [ 
  3.     TypeOrmModule.forRoot({ 
  4.       type: 'mysql'
  5.       host: 'localhost'
  6.       port: 3306, 
  7.       username: 'root'
  8.       password'你的密碼'
  9.       database'數(shù)據(jù)庫名'
  10.       synchronize: true 
  11.     }), 
  12.     NotesModule 
  13.   ] 
  14. }) 
  15. export class AppModule {} 

forFeature 用于創(chuàng)建不同實(shí)體類對應(yīng)的 Repository,在用到該實(shí)體的 Module 里引入。

  1. @Module({ 
  2.   imports: [TypeOrmModule.forFeature([Aaa])], 
  3.   controllers: [AaaController], 
  4.   providers: [AaaService], 
  5.   exports: [AaaService] 
  6. }) 
  7. export class AaaModule {} 

我們知道了 Typeorm 和 Nest.js 都是做什么的和怎么用,簡單小結(jié)一下:

Typeorm 是 ORM 框架,用于把對象的操作同步為對數(shù)據(jù)庫的操作,會自動執(zhí)行 sql 語句。

Nest.js 是 MVC 框架,用于 Web 后端應(yīng)用的邏輯分層,還提供了 Module 用來進(jìn)一步劃分 Controller 和 Service。此外,Nest.js 提供了 IOC 容器,統(tǒng)一管理對象的創(chuàng)建和依賴關(guān)系,根據(jù)聲明來自動注入依賴。

兩者的結(jié)合就是通過 @nestjs/typeorm 的包,它有兩個(gè)靜態(tài)方法用于生成 Module。

說了這么多,大家可能還理解的不是很清楚,那么我們就來做下筆記管理的實(shí)戰(zhàn)案例吧。

實(shí)戰(zhàn)案例

Nest.js 樣板代碼比較多,自己寫還是比較費(fèi)事的,@nestjs/cli 的命令行工具對這些做了自動化。

首先要搭項(xiàng)目的骨架,用

  1. nest new project-name 

然后生成某個(gè) Module 的代碼

  1. nest g resource xxx 

生成的代碼就是帶有 Controller、Service、Module 的,并且也有了 CRUD 的樣板代碼。

我們重點(diǎn)來看下 Controller 的代碼:

  1. import { Controller, Get, Post, Body, Patch, Param, Delete } from '@nestjs/common'
  2. import { XxxService } from './xxx.service'
  3. import { CreateXxxDto } from './dto/create-xxx.dto'
  4. import { UpdateXxxDto } from './dto/update-xxx.dto'
  5.  
  6. @Controller('xxx'
  7. export class XxxController { 
  8.   constructor(private readonly xxxService: XxxService) {} 
  9.  
  10.   @Post() 
  11.   create(@Body() createXxxDto: CreateXxxDto) { 
  12.     return this.xxxService.create(createXxxDto); 
  13.   } 
  14.  
  15.   @Get() 
  16.   findAll() { 
  17.     return this.xxxService.findAll(); 
  18.   } 
  19.  
  20.   @Get(':id'
  21.   findOne(@Param('id') id: string) { 
  22.     return this.xxxService.findOne(+id); 
  23.   } 
  24.  
  25.   @Patch(':id'
  26.   update(@Param('id') id: string, @Body() updateXxxDto: UpdateXxxDto) { 
  27.     return this.xxxService.update(+id, updateXxxDto); 
  28.   } 
  29.  
  30.   @Delete(':id'
  31.   remove(@Param('id') id: string) { 
  32.     return this.xxxService.remove(+id); 
  33.   } 

@Controller 的參數(shù)可以聲明 URL 路徑,@Get、@Post、@Patch、@Delete 也可以通過參數(shù)聲明 URL 路徑,最終會把兩個(gè)拼起來。比如 /xxx/:id 的 get 方法。

@Get、@Post、@Patch、@Delete 分別對應(yīng)不同的請求方式。

@Param 是取路徑中的參數(shù),@Query 是取查詢字符串的參數(shù)。

@Body 是把請求參數(shù)設(shè)置到對象的屬性上,被用來傳遞數(shù)據(jù)的對象叫做 dto(data transfer object)。

再就是返回的對象會被序列化成 JSON,不需要手動序列化。

然后再看下 Service:

  1. import { Injectable } from '@nestjs/common'
  2. import { CreateXxxDto } from './dto/create-xxx.dto'
  3. import { UpdateXxxDto } from './dto/update-xxx.dto'
  4.  
  5. @Injectable() 
  6. export class XxxService { 
  7.   create(createXxxDto: CreateXxxDto) { 
  8.     return 'This action adds a new xxx'
  9.   } 
  10.  
  11.   findAll() { 
  12.     return `This action returns all xxx`; 
  13.   } 
  14.  
  15.   findOne(id: number) { 
  16.     return `This action returns a #${id} xxx`; 
  17.   } 
  18.  
  19.   update(id: number, updateXxxDto: UpdateXxxDto) { 
  20.     return `This action updates a #${id} xxx`; 
  21.   } 
  22.  
  23.   remove(id: number) { 
  24.     return `This action removes a #${id} xxx`; 
  25.   } 

這些 service 的方法都沒有具體實(shí)現(xiàn)。

我們引入 Typeorm 來做數(shù)據(jù)庫的 CRUD。

在根模塊引入用于數(shù)據(jù)庫連接的 Module

在剛創(chuàng)建的模塊引入實(shí)體對應(yīng)的 Module:

創(chuàng)建筆記實(shí)體,用 @Entity 標(biāo)識。并且用 @Column、@PrimaryGeneratedColumn 來標(biāo)識列和主鍵。

  1. import { Entity, PrimaryGeneratedColumn, Column } from "typeorm"
  2.  
  3. @Entity() 
  4. export class Note{ 
  5.  
  6.     @PrimaryGeneratedColumn() 
  7.     id: number; 
  8.  
  9.     @Column() 
  10.     title: string; 
  11.  
  12.     @Column() 
  13.     content: string; 
  14.  
  15.     @Column() 
  16.     createTime: Date
  17.  
  18.     @Column() 
  19.     updateTime: Date
  20.  
  21.     @Column() 
  22.     isDelete: boolean; 

之后在 service 里注入實(shí)體對應(yīng)的操作類 Repository,就可以實(shí)現(xiàn)對筆記的增刪改查了。

用到的 dto 就是參數(shù)對應(yīng)的對象,他們是實(shí)體的一部分屬性的集合。比如 update dto:

  1. export class UpdateNoteDto { 
  2.     title: string; 
  3.  
  4.     content: string; 
  5.  
  6.     createTime: Date
  7.  
  8.     updateTime: Date
  9.  
  10.     isDelete: boolean; 

這樣,就實(shí)現(xiàn)了對筆記的增刪改查。

我們用 postman 來測試下效果:

運(yùn)行 npm start 把項(xiàng)目跑起來

可以看到 4 個(gè)接口的路由映射都成功了。

數(shù)據(jù)庫一開始有兩條記錄:

通過查詢接口能正確的查出來:

然后測試下修改接口:

數(shù)據(jù)庫中確實(shí)被修改了:

經(jīng)過測試,對筆記單表的 CRUD 的功能正常。

視頻

我們完成了第一個(gè) Nest.js 的后端應(yīng)用!

完整代碼上傳了 github:https://github.com/QuarkGluonPlasma/nestjs-exercize

總結(jié)

Typeorm 是一個(gè) ORM 框架,通過映射表和對象的對應(yīng)關(guān)系,就可以把對對象的操作轉(zhuǎn)換為對數(shù)據(jù)庫的操作,自動執(zhí)行 sql 語句。

Nest.js 是一個(gè) MVC 框架,提供了 Module、Controller、Service 的邏輯劃分,也實(shí)現(xiàn)了 IOC 模式,集中管理對象和自動注入依賴。

Typeorm 和 Nest.js 的結(jié)合使用 @nestjs/typeorm 的包,它提供了一個(gè) TypeormModule 的模塊,有 forRoot 和 forFeature 兩個(gè)靜態(tài)方法。forRoot 方法用于生成連接數(shù)據(jù)庫的 Module,forFeature 用于生成實(shí)體對應(yīng)的 Repository 的 Module。

Nest.js 有很多樣板代碼,可以用 @nestjs/cli 的命令行工具生成,包括整體的和每個(gè) Module 的。

 

總之,理解了 IOC,理解了 Module、Controller、Service 的劃分,就算是初步掌握了 Nest.js,結(jié)合 Typeorm 的 ORM 框架可以輕松的做數(shù)據(jù)庫表的 CRUD。

 

責(zé)任編輯:武曉燕 來源: 神光的編程秘籍
相關(guān)推薦

2022-03-18 21:51:10

Nest.jsAOP 架構(gòu)后端

2021-06-18 06:48:54

前端Nest.js技術(shù)熱點(diǎn)

2022-02-02 20:21:24

短信驗(yàn)證碼登錄

2022-12-27 09:22:06

Nest.js框架

2022-03-02 14:00:46

Nest.jsExpress端口

2024-05-06 08:48:18

nestjava?MVC?

2024-02-04 19:15:09

Nest.js管理項(xiàng)目

2021-12-27 20:29:21

機(jī)制PipeExceptionFi

2021-10-28 17:40:22

Nest.js前端代碼

2024-05-21 10:35:34

2021-06-29 06:25:22

Nest.jsTypeORM數(shù)據(jù)庫

2023-01-30 09:01:34

DecoratorsJS語法

2010-11-22 13:13:30

MySQL模糊查詢

2010-10-15 14:39:55

MySQL單表大小

2012-04-19 10:06:16

ibmdw

2010-10-08 15:37:21

MySQL單表

2010-11-24 09:37:01

mysql快速建表

2024-03-15 09:26:59

2020-09-27 08:00:49

分庫分表

2010-11-24 10:35:34

MySQL單表多字段
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

亚洲国产精品一区二区尤物区| 日韩av一级大片| 欧美韩国日本在线观看 | 亚洲国产欧美一区二区三区久久| 99久久久成人国产精品| 国产美女精彩久久| 国产精品一品二品| 涩涩视频在线观看免费| 少妇高潮 亚洲精品| 欧美日韩一区二区国产| 日韩av在线综合| 欧美精品久久一区二区三区 | 国产一区私人高清影院| av爱爱亚洲一区| 成人在线二区| 韩国福利视频一区| 精品一区二区三区影院在线午夜| 91中文字幕一区| 午夜综合激情| 国内视频一区二区| 2023国产一二三区日本精品2022| 日本一区二区免费看| 白嫩白嫩国产精品| 国内精品久久久久伊人av| 成人三级网址| 亚洲第一狼人社区| 深夜成人福利| 亚洲欧洲第一视频| 成人爽a毛片免费啪啪动漫| 精品粉嫩超白一线天av| 国产传媒视频在线观看| 91国内揄拍国内精品对白| 成人aa视频在线观看| 川上优的av在线一区二区| 欧美日韩精品一区二区三区四区| 国产美女性感在线观看懂色av | 国产一区二区三区国产精品| 亚洲一区三区视频在线观看| 欧美私人免费视频| 久久一本综合| 全网国产福利在线播放| 欧美激情a在线| 久久久精品国产99久久精品芒果| 欧美性猛交xxx高清大费中文| 色综合电影网| 精品国产乱码久久久久久免费| 亚洲区国产区| 生活片a∨在线观看| 成人免费在线一区二区三区| 高跟丝袜一区二区三区| 99精品电影| 四虎在线观看| 91九色在线观看| 91久久精品日日躁夜夜躁欧美| 欧美独立站高清久久| 中文官网资源新版中文第二页在线观看| 欧洲成人在线观看| 怡红院av一区二区三区| 国产精品手机在线播放| 理论片在线观看理伦片| 国产精品视频一区国模私拍| 亚洲国产日韩精品| 亚洲精品tv久久久久久久久久| 中文字幕毛片| 97碰碰视频| 91麻豆精品91久久久久久清纯| 久久久久免费| 欧美激情护士| 久草热视频在线观看| 欧美另类极品videosbest最新版本| 国产亚洲成av人在线观看导航| 老汉色老汉首页av亚洲| 日韩加勒比系列| 成人性生交xxxxx网站| 欧美日韩1区2区| 美女诱惑一区二区| 欧美成人精品三级网站| 国产v亚洲v天堂无码久久久| 国产成人精品一区二区| 在线观看日韩毛片| 麻豆免费看一区二区三区| 疯狂欧洲av久久成人av电影| 国产青青视频| 国产一区自拍视频| 日韩精品在线观看一区| 久久久久久久久99精品| 青青草综合网| 日本电影在线观看| 欧美一区二区三区爽大粗免费| 清纯唯美亚洲综合| 欧美日韩在线直播| 成人h精品动漫一区二区三区| 免费精品国产| 在线观看h网| 成人精品视频一区二区| 91精品在线看| 亚洲欧洲偷拍精品| 亚洲精品国产一区二区精华液| 中文日韩在线| 91精品国产一区二区在线观看| 亚洲伦理电影| 亚洲午夜精品久久| 国语自产精品视频在免费| 欧美日韩亚洲国产综合| 成人深夜福利app| 久久一区二区中文字幕| sm在线播放| 免费视频二区| 亚洲一区二区三区色| 国产91精品久久久久| 日韩欧美一区二区视频| 国产精品久久毛片a| 国产精品一卡| 网站一区二区| 成人a在线视频免费观看| 99视频精品免费| 国产日韩在线一区二区三区| 久久影视电视剧免费网站| 色视频欧美一区二区三区| 成人白浆超碰人人人人| 国产精品草草| 99re6热只有精品免费观看| 含羞草www国产在线视频| www.99av.com| 亚洲精品一品区二品区三品区| 国产精品96久久久久久| 国产午夜精品麻豆| 日本电影亚洲天堂一区| 99精品视频在线播放观看| 亚洲天堂成人| 亚洲男人都懂第一日本| 成人片免费看| 啊v在线视频| 奇米777影视成人四色| 日韩亚洲视频在线| 国产99久久精品一区二区永久免费 | 久久精品国产亚洲7777| 欧美午夜理伦三级在线观看| 国产夜色精品一区二区av| 天堂一区二区在线免费观看| 亚洲福利网站| 天堂久久午夜av| 黄色在线免费网站| 亚洲网站情趣视频| 精品久久久久久久无码| 亚洲一区二区三区精品在线观看 | 亚洲成人第一| 成人激情黄色网| 欧美乱妇高清无乱码| 精品国产一区久久| 欧美日韩综合视频| 国产欧美一区二区精品性| 免费美女久久99| 色综合天天做天天爱| 欧美精品视频www在线观看| 中文字幕av一区中文字幕天堂| 91sa在线看| 亚洲天堂免费视频| 一区二区成人精品| 成人免费毛片嘿嘿连载视频| 久久久久久影院| 国产欧美一区二区三区米奇| 国产伦理精品| 伦xxxx在线| 国产福利小视频在线| 影音先锋可以看的网站| jizz欧美性11| 免费观看成人网| 免费看国产一级片| mm131午夜| 一区二区精品在线观看| 国产区日韩欧美| 亚洲自拍偷拍色片视频| 国产精品国模在线| 91精品国产乱码久久久久久蜜臀| 日韩中文字幕在线播放| 亚洲欧美国产另类| 日韩av最新在线观看| 精品久久久久久久久久久久久久久| 欧美色区777第一页| 欧美在线一区二区| 在线观看一区日韩| 在线看国产日韩| 欧美调教femdomvk| 欧美日韩1区2区| 91麻豆精品国产91久久久使用方法 | 91高清视频免费| 欧美激情乱人伦| 欧美精品激情视频| 国内精品久久久久久中文字幕| 欧美大片在线看免费观看| 久热爱精品视频线路一| 欧美成人一二三| 久久久久成人网| 欧美激情综合亚洲一二区| 欧美成人精品在线观看| 国模视频一区二区| 国产精品白嫩美女在线观看| 欧美激情一区二区三区蜜桃视频 | 久久蜜臀精品av|