使用Nest.js實(shí)現(xiàn)接口教程示例
一.項(xiàng)目初始化
1.安裝腳手架
npm i -g @nestjs/cli
2.創(chuàng)建項(xiàng)目
nest new 項(xiàng)目名稱
3. cd 到項(xiàng)目
4.安裝依賴
npm i
5.啟動(dòng)項(xiàng)目,監(jiān)視文件,自動(dòng)重新編譯和重新加載服務(wù)器
npm run start:dev
6.查看啟動(dòng)項(xiàng)目啟動(dòng)端口號(hào),進(jìn)入程序入口文件 src/main.ts 查看
瀏覽器打開 http://localhost:3000/
二.核心文件介紹
app.controller.spec.ts
控制器的單元測(cè)試,也不知道怎么用的。
app.controller.ts
路由的基本控制器,就是操作邏輯的地方,處理請(qǐng)求響應(yīng)。
app.module.ts
應(yīng)用程序的根模塊。
app.service.ts
寫數(shù)據(jù)庫(kù)查詢語(yǔ)句的地方。
main.ts
應(yīng)用程序的入口文件,它使用核心函數(shù)NestFactory
創(chuàng)建一個(gè) Nest 應(yīng)用程序?qū)嵗?/p>
三.創(chuàng)建一個(gè)接口模塊,處理請(qǐng)求
為了快速創(chuàng)建內(nèi)置驗(yàn)證的 CRUD 控制器,您可以使用 CLI 的CRUD 生成器:nest g resource [name]
。
這里根據(jù)官方文檔提示創(chuàng)建cats模塊
nest g resource cats
選擇 REST API風(fēng)格。
好了,現(xiàn)在src文件目錄下多了cats目錄,趕緊看看吧。
誒,我們是創(chuàng)建了cats模塊了,我們有使用嗎,有的,在哪里使用了呢?在應(yīng)用程序的根模塊里
使用了啊,哦,原來使用nest g resource cats
命令創(chuàng)建時(shí),同時(shí)使用了,真方便,ok快去看看吧。
四.看看cats模塊有啥吧
1.先看controller吧,請(qǐng)求方法都在這了
首先,映入眼簾的是頭部引入了很多很多......啥,不知道是啥。
接下去看吧,有一個(gè)@Controller('cats')
,這是個(gè)裝飾器,里面有個(gè)參數(shù)喔,估計(jì)是路由前綴吧,接著看有幾個(gè)@開頭的 post、get、delete的東東,應(yīng)該是接口方法,嗯,是的,我們?nèi)ビ肁PIFox請(qǐng)求一下
我這個(gè)get請(qǐng)求返回了“This action returns all cats”,這不是我寫的啊,在哪里的,走,去看看。
@Get() findAll() { return this.catsService.findAll(); }
大哥,我在controller找到這么個(gè)玩意,是個(gè)service方法耶,讓我按著我的Ctrl鍵點(diǎn)擊findAll進(jìn)去看看先。進(jìn)到了cats.service.ts
文件,里面有一個(gè)findAll
方法,返回了一串英文,我不懂英文喔,改改才行,我是個(gè)大帥b?。?!
2.你這地址有點(diǎn)單調(diào)啊,能不能接收query參數(shù)的?
肯定能啊
那行,我給你傳個(gè)?sex=1,你返回個(gè)女
字給我。
這還不簡(jiǎn)單? 先在controller頭頂哪里的@nestjs/common
導(dǎo)入 Req
然后使用
// 導(dǎo)入類型 import { Request } from 'express'; @Get() findAll(@Req() req: Request): string { console.log('req:', req.query); return this.catsService.findAll(req.query.sex as string); }
ps: 這里獲取參數(shù)其實(shí)可以用 @Query,不知道咋的用了上面這種,哈哈哈
這時(shí)候,我打印出了所有的query參數(shù)。就差給他返回女
字了。
cats.service.ts findAll(sex: string) { const sexObj = { '0': '男', '1': '女', }; return sexObj[sex]; }
寫好了,趕緊在APIFox看看結(jié)果。
返回結(jié)果正確,我還想在post請(qǐng)求傳param參數(shù)給你,傳傳傳,傳你個(gè)頭頭,好吧,那我想查數(shù)據(jù)庫(kù),總行了吧。
五.連接mysql數(shù)據(jù)庫(kù)
先安裝管理數(shù)據(jù)庫(kù)typeorm
和連接數(shù)據(jù)庫(kù)mysql2
庫(kù)
npm install --save @nestjs/typeorm typeorm mysql2
然后在app.module.ts
添加配置
import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; import { AppController } from './app.controller'; import { AppService } from './app.service'; import { CatsModule } from './cats/cats.module'; @Module({ imports: [ TypeOrmModule.forRoot({ type: 'mysql', host: '127.0.0.1', port: 3306, username: 'root', password: 'root', database: 'blog', entities: ['dist/**/*.entity{.ts,.js}'], synchronize: true, }), CatsModule, ], controllers: [AppController], providers: [AppService], }) export class AppModule {}
好了,數(shù)據(jù)庫(kù)連接成功。
我們現(xiàn)在是用typeorm
來管理數(shù)據(jù)庫(kù),這個(gè)庫(kù)是通過實(shí)體來映射到數(shù)據(jù)庫(kù)表的,建表我們以前是直接在數(shù)據(jù)庫(kù)中創(chuàng)建表結(jié)構(gòu),現(xiàn)在我們通過實(shí)體來創(chuàng)建庫(kù)。什么意識(shí)呢?接下來一起嘗試。
在cats文件夾下,有一個(gè)entities
文件夾,用來放實(shí)體的,點(diǎn)開,發(fā)現(xiàn)有個(gè)ts文件,沒錯(cuò)我們就是在這個(gè)ts文件來寫實(shí)體,也就是數(shù)據(jù)庫(kù)表結(jié)構(gòu)。
我寫了這些東西:
import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm'; // 建立一個(gè)實(shí)體映射到數(shù)據(jù)庫(kù)表 @Entity('cats') export class Cat { @PrimaryGeneratedColumn() id: number; @Column({ length: 10 }) name: string; }
@Entity('cats')用來修飾說,我這個(gè)類是一個(gè)實(shí)體啊,名字叫cats
,其中有字段:id、name,你按照這個(gè)結(jié)構(gòu),在mysql中創(chuàng)建一個(gè)表吧。我們打開數(shù)據(jù)庫(kù),看下是不是創(chuàng)建了一個(gè)叫cats的表呢。
好,沒什么問題,可以映射。我們?cè)偬砑右粋€(gè)desc
字段試試
沒毛病。
六.操作數(shù)據(jù)庫(kù)
實(shí)體有了,怎么使用呢?
我們操作數(shù)據(jù)庫(kù)正常情況下都是在service中,那么就是去service中使用即可,直接貼代碼,我們向數(shù)據(jù)庫(kù)中插入一條數(shù)據(jù)
import { Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; import { CreateCatDto } from './dto/create-cat.dto'; import { UpdateCatDto } from './dto/update-cat.dto'; import { Cat } from './entities/cat.entity'; @Injectable() export class CatsService { constructor( @InjectRepository(Cat) private readonly catRepository: Repository<Cat>, ) {} async create(createCatDto: Partial<CreateCatDto>): Promise<Cat> { console.log(createCatDto); return this.catRepository.save(createCatDto); } }
啊哈,保存的時(shí)候報(bào)錯(cuò)了,說什么實(shí)體沒有引用,那么我們就引用它,在cats.module.ts
import { Module } from '@nestjs/common'; import { CatsService } from './cats.service'; import { CatsController } from './cats.controller'; import { TypeOrmModule } from '@nestjs/typeorm'; import { Cat } from './entities/cat.entity'; @Module({ imports: [TypeOrmModule.forFeature([Cat])], controllers: [CatsController], providers: [CatsService], }) export class CatsModule {}
service寫好了,但是還沒調(diào)用它呢,去哪里調(diào)用啊,controller啊,這么快就忘記了嗎。
import { Controller, Get, Post, Body, Patch, Param, Delete, Req, } from '@nestjs/common'; import { CatsService } from './cats.service'; import { CreateCatDto } from './dto/create-cat.dto'; import { UpdateCatDto } from './dto/update-cat.dto'; import { Request } from 'express'; @Controller('cats') export class CatsController { constructor(private readonly catsService: CatsService) {} @Post('/create') create(@Body() createCatDto: CreateCatDto) { console.log(createCatDto); return this.catsService.create(createCatDto); } }
細(xì)心的盆友發(fā)現(xiàn)了,說你這CreateCatDto
哪里來的?你看看cats目錄下有一個(gè)dto文件夾,有個(gè)create-cat.dto.ts
,它就是從這里來的,哈哈哈
export class CreateCatDto { name: string; desc: string; }
好啦好啦,去ApiFox看下結(jié)果
發(fā)送請(qǐng)求,OK,沒報(bào)錯(cuò),我們?nèi)?shù)據(jù)庫(kù)瞧瞧,有沒有數(shù)據(jù)
牛逼啊,大哥,原來寫接口這么簡(jiǎn)單?。。?!
感謝觀看?。?!
七.中間件你應(yīng)該了解過吧,在這里應(yīng)該怎么用呢
老規(guī)矩先創(chuàng)建對(duì)應(yīng)的文件,nestjs有快捷創(chuàng)建中間件的命令呢
nest g middleware middleware/reqMi
我創(chuàng)建了一個(gè)middleware目錄下的叫reqMi
中間件,命名嗎,簡(jiǎn)單了點(diǎn)。
好,看看中間件現(xiàn)在有什么
import { Injectable, NestMiddleware } from '@nestjs/common'; @Injectable() export class ReqMiMiddleware implements NestMiddleware { use(req: any, res: any, next: () => void) { console.log('你好,我是中間件'); next(); } }
我這里打印了一句話。 那么怎么調(diào)用呢?調(diào)用中間件有很多種方式,可以參考官方文檔哦。
我現(xiàn)在是在app.module.ts
調(diào)用
export class AppModule { configure(consumer: MiddlewareConsumer) { consumer.apply(ReqMiMiddleware).forRoutes('cats'); } }
ReqMiMiddleware
被調(diào)用啦,forRoutes('cats'),表示為路由為cats前綴的路由添加這個(gè)中間件,nestjs中間件,都是通過匹配路由路徑來調(diào)用的,官方有比較詳細(xì)的介紹。 我們現(xiàn)在去看看,是不是調(diào)用成功了呀。
控制臺(tái)打印
ok,中間件應(yīng)用成功啦。
以上就是使用Nest.js實(shí)現(xiàn)接口教程示例的詳細(xì)內(nèi)容,更多關(guān)于Nest.js接口教程的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Bootstrap實(shí)現(xiàn)漸變頂部固定自適應(yīng)導(dǎo)航欄
這篇文章給大家介紹了Bootstrap實(shí)現(xiàn)漸變頂部固定自適應(yīng)導(dǎo)航欄,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01JS switch判斷 三目運(yùn)算 while 及 屬性操作代碼
這篇文章主要介紹了JS switch判斷 三目運(yùn)算 while 及 屬性操作代碼,需要的朋友可以參考下2017-09-09小程序點(diǎn)擊圖片實(shí)現(xiàn)自動(dòng)播放視頻
這篇文章主要為大家詳細(xì)介紹了小程序點(diǎn)擊圖片實(shí)現(xiàn)自動(dòng)播放視頻,停止上一個(gè)視頻播放,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-11-11js實(shí)現(xiàn)瀏覽器窗口大小被改變時(shí)觸發(fā)事件的方法
這篇文章主要介紹了js實(shí)現(xiàn)瀏覽器窗口大小被改變時(shí)觸發(fā)事件的方法,實(shí)例分析了window.onresize方法的使用技巧,需要的朋友可以參考下2015-02-02JavaScript實(shí)現(xiàn)相冊(cè)彈窗功能(zepto.js)
這篇文章主要介紹了JavaScript基于zepto.js實(shí)現(xiàn)相冊(cè)彈窗功能的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-06-06javascript實(shí)現(xiàn)信息的顯示和隱藏如注冊(cè)頁(yè)面
信息的顯示和隱藏在某些時(shí)候還是比較使用的,就比如注冊(cè)信息,下面有個(gè)不錯(cuò)的示例,感興趣的朋友可以了解下2013-12-12