您好,登錄后才能下訂單哦!
本文小編為大家詳細(xì)介紹“node中的Nest.js框架怎么用”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“node中的Nest.js框架怎么用”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學(xué)習(xí)新知識吧。
Nest 是一個(gè)用于構(gòu)建高效,可擴(kuò)展的 Node.js 服務(wù)器端應(yīng)用程序的框架。它使用漸進(jìn)式 JavaScript,內(nèi)置并完全支持 TypeScript(但仍然允許開發(fā)人員使用純 JavaScript 編寫代碼)并結(jié)合了 OOP(面向?qū)ο缶幊蹋?,F(xiàn)P(函數(shù)式編程)和 FRP(函數(shù)式響應(yīng)編程)的元素。
Nest 框架底層 HTTP 平臺默認(rèn)是基于 Express 實(shí)現(xiàn)的,所以無需擔(dān)心第三方庫的缺失。 Nest 旨在成為一個(gè)與平臺無關(guān)的框架。 通過平臺,可以創(chuàng)建可重用的邏輯部件,開發(fā)人員可以利用這些部件來跨越多種不同類型的應(yīng)用程序。 nest 目前有兩個(gè)支持開箱即用的 HTTP 平臺:express 和 fastify 可以在項(xiàng)目中直接引入。
目前市面上有很多 node 框架可供大家選擇。
Express.js 是 Node.JS 誕生之初,是一款基于Node.js以及Chrome V8引擎,快速、極簡的JS服務(wù)端開發(fā)框架。
Koa.js是一款微型Web框架,寫一個(gè)hello world很簡單,但web應(yīng)用離不開session,視圖模板,路由,文件上傳,日志管理。這些 Koa 都不提供,需要自行去官方的 Middleware 尋找。然而,100個(gè)人可能找出100種搭配。
Egg.js是基于Koa.js,解決了上述問題,將社區(qū)最佳實(shí)踐整合進(jìn)了Koa.js,另取名叫Egg.js,并且將多進(jìn)程啟動(dòng),開發(fā)時(shí)的熱更新等問題一并解決了。這對開發(fā)者很友好,開箱即用,開箱即是最(較)佳配置。Egg.js發(fā)展期間,ECMAScript又推出了 async await,相比yield的語法async寫起來更直。后面Koa.js也同步進(jìn)行了跟進(jìn)。
Midway 是阿里團(tuán)隊(duì),基于漸進(jìn)式理念研發(fā)的 Node.js 框架,結(jié)合了 OOP和函數(shù)式兩種編程范式。以 egg 是作為底層框架,加上了良好的TypeScript的定義支持等眾多新特性,推出了Midway,有興趣的小伙伴可以去官方文檔學(xué)習(xí)一下
Nest.js 基于Express.js的全功能框架 Nest.js,他是在Express.js上封裝的,充分利用了TypeScript的特性;Nest.js的優(yōu)點(diǎn)是社區(qū)活躍,漲勢喜人,截止目前在 GitHub 擁有 43.7k Star
是近期比較熱門的企業(yè)級框架。
基于支持底層支持ts與企業(yè)級和社區(qū)活躍度等綜合考慮,這里我選擇用nest來進(jìn)行學(xué)習(xí)。各位同學(xué)可以按需選擇。
確保電腦安裝了 Node.js (>= 10.13.0)
這里我使用的 node 版本為 v14.16.1
包用的是 yarn 管理的 版本為 1.22.17
創(chuàng)建項(xiàng)目
$ npm i -g @nestjs/cli $ nest new project-name
創(chuàng)建好項(xiàng)目后看一下項(xiàng)目目錄,以下是核心文件的簡單描述:
app.controller.ts | 帶有單個(gè)路由的基本控制器示例 |
---|---|
app.controller.spec.ts | 對于基本控制器的單元測試樣例 |
app.module.ts | 應(yīng)用程序的根模塊。 |
app.service.ts | 帶有單個(gè)方法的基本服務(wù) |
main.ts | 應(yīng)用程序入口文件。用來創(chuàng)建 Nest 應(yīng)用實(shí)例。 |
/* main.ts */ import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; async function bootstrap() { const app = await NestFactory.create(AppModule); // 使用核心類 NestFactory 返回一個(gè) 接口對象 await app.listen(3000); // 這里是默認(rèn)設(shè)置的端口號 } bootstrap();
運(yùn)行項(xiàng)目
$ npm run start:watch // 啟動(dòng)項(xiàng)目并監(jiān)聽代碼變動(dòng) 這里可以在package.json 中進(jìn)行配置指令
我們可以看到服務(wù)已經(jīng)啟動(dòng),輸入本機(jī)地址并帶上端口號3000,發(fā)送一次 get 請求 則會(huì)返回 `Hello World`。 這里是因?yàn)樵?nbsp;app.controll.ts 文件中 @Get()HTTP請求裝飾器告訴Nest為HTTP請求的特定端點(diǎn)創(chuàng)建處理程序。
在開始寫代碼之前我們先簡單看一下nest中的基礎(chǔ)路由配置是怎樣的,就目前而言我的理解為nest的路由是由 全局路由 路由前綴(局部路由) 方法裝飾器 組成路由映射提供給前端使用。
/* main.ts */ main文件中我們可以在項(xiàng)目監(jiān)聽前配置一個(gè)全局的api前綴 async function bootstrap() { const app = await NestFactory.create(AppModule); //設(shè)置全局前綴 app.setGlobalPrefix('api'); await app.listen(3000); } /* app.controller.ts */ @Controller('user') // 控制器設(shè)置路由前綴 我理解為局部路由 export class AppController { constructor(private readonly appService: AppService) {} @Get('find') // 方法裝飾器設(shè)置路由路徑 這里我理解為設(shè)置api子路由 getHello(): string { return this.appService.getHello(); } }
以上方法在api中映射成完整的路由為GET api/user/find
。
其中 @Get()HTTP請求裝飾器告訴Nest為HTTP請求的特定端點(diǎn)創(chuàng)建處理程序。
可以看到上面的 get
接收請求及路由以可以使用,下面我們看一下 nest
中如何接收 post
等其他請求方式
這里用到的 Nest 提供的請求裝飾器知識點(diǎn)Request
對象代表 HTTP
請求,并具有查詢字符串,請求參數(shù)參數(shù),HTTP 標(biāo)頭(HTTP header) 和 正文(HTTP body)的屬性(在這里閱讀更多)。在多數(shù)情況下,不必手動(dòng)獲取它們。 我們可以使用專用的裝飾器,比如開箱即用的 @Body()
或 @Query()
。 下面是 Nest 提供的裝飾器及其代表的底層平臺特定對象的對照列表。
下面我們看一下 nest 中如何接收 get post put delete
發(fā)起的請求,用幾個(gè)可用的裝飾器來創(chuàng)建基本控制器。 該控制器暴露了幾個(gè)訪問和操作內(nèi)部數(shù)據(jù)的方法。
Get
我們先創(chuàng)建一個(gè) user 服務(wù)/控制器/moudle
/ * user.service.ts */ 先創(chuàng)建一個(gè) user service服務(wù)文件 import { Injectable } from '@nestjs/common'; @Injectable() // // 這里 export class UserService { findUser(sid: string): string { console.log(sid); if (sid === '123456') { return 'kid is here'; } return 'No one here'; } }
該服務(wù)將負(fù)責(zé)數(shù)據(jù)存儲和檢索,其由 UserController
使用,我們用 @Injectable()
來裝飾這個(gè)類
/ * user.controller.ts */ 創(chuàng)建一個(gè) user 控制器文件 import { Controller, Get, Query } from '@nestjs/common'; import { UserService } from './user.service'; @Controller('user') export class UserController { constructor(private readonly userService: UserService) {} @Get('findOne') //這里暴露出的路由為 user/find findUser(@Query() query: any) { return this.userService.findUser(query.sid); }
控制器的目的是接收應(yīng)用的特定請求。路由機(jī)制控制哪個(gè)控制器接收哪些請求。通常,每個(gè)控制器有多個(gè)路由,不同的路由可以執(zhí)行不同的操作。
為了創(chuàng)建一個(gè)基本的控制器,我們使用類和裝飾器
。裝飾器將類與所需的元數(shù)據(jù)相關(guān)聯(lián),并使 Nest 能夠創(chuàng)建路由映射(將請求綁定到相應(yīng)的控制器)。
/ * user.module.ts */ 創(chuàng)建一個(gè) user mod import { Module } from '@nestjs/common'; import { UserController } from './user.controller'; import { UserService } from './user.service'; @Module({ controllers: [UserController], providers: [UserService], }) export class UserModule {} /* app.module.ts */ 最后在app.module中引入我們自己寫的module import { Module } from '@nestjs/common'; import { AppController } from './app.controller'; import { AppService } from './app.service'; import { UserModule } from './user/user.module'; @Module({ imports: [UserModule], controllers: [AppController], providers: [AppService], }) export class AppModule {}
控制器已經(jīng)準(zhǔn)備就緒,可以使用,但是 Nest 依然不知道 UserController
是否存在,所以它不會(huì)創(chuàng)建這個(gè)類的一個(gè)實(shí)例。
控制器總是屬于模塊,這就是為什么我們在 @Module()
裝飾器中包含 controllers
數(shù)組的原因。 由于除了根模塊 AppModule
之外,我們還沒有定義其他模塊,所以我們將使用它來介紹 UserController
使用 postman 看下效果
可以看到發(fā)送get請求 請求成攻。
接下來我們依次使用 post put delete
發(fā)送請求,看nest是如何接受并處理的
Post
user.service 文件
/ * user.service.ts */ 先創(chuàng)建一個(gè) user service服務(wù)文件 import { Injectable } from '@nestjs/common'; @Injectable() // // 這里 setUser(sid: string, body: any): any { if (sid === '123456') { return { msg: '設(shè)置成功', body, }; } }
user.controller 文件
/ * user.controller.ts */ 創(chuàng)建一個(gè) user 控制器文件 import { Controller, Get, Query } from '@nestjs/common'; import { UserService } from './user.service'; @Controller('user') export class UserService { @Post('set') setUser(@Body() body: any, @Query() query: any) { return this.userService.setUser(query.sid, body); } }
使用 postman 看下效果
可以看到發(fā)送 post 請求 請求成攻。
Put
user.service 文件
/ * user.service.ts */ 先創(chuàng)建一個(gè) user service服務(wù)文件 import { Injectable } from '@nestjs/common'; @Injectable() // // 這里 updateUser(sid: string, body: any): any { if (sid === '123456') { return { msg: '設(shè)置成功', body, }; } }
user.controller 文件
這里用到了 Param 裝飾器 @Param()
用于修飾一個(gè)方法的參數(shù)(上面示例中的 params
),并在該方法內(nèi)將路由參數(shù)作為被修飾的方法參數(shù)的屬性。如上面的代碼所示,我們可以通過引用 params.id
來訪問(路由路徑中的) id
參數(shù)。 您還可以將特定的參數(shù)標(biāo)記傳遞給裝飾器,然后在方法主體中按參數(shù)名稱直接引用路由參數(shù)。
/ * user.controller.ts */ 創(chuàng)建一個(gè) user 控制器文件 import { Body, Controller, Get, Param, Post, Put, Query } from '@nestjs/common'; import { UserService } from './user.service'; @Controller('user') export class UserService { @Put(':sid') updateUser(@Param('sid') sid: string, @Body() body: any) { return this.userService.updateUser(sid, body); } }
使用 postman 看下效果
可以看到發(fā)送 put 請求 請求成攻。
Delete
user.service 文件
/ * user.service.ts */ 先創(chuàng)建一個(gè) user service服務(wù)文件 import { Injectable } from '@nestjs/common'; @Injectable() // // 這里 deleteUser(sid: string): any { if (sid === '123456') { return { msg: '刪除成功', }; } }
user.controller 文件
/ * user.controller.ts */ 創(chuàng)建一個(gè) user 控制器文件 import { Body, Controller, Get, Param, Post, Put, Query } from '@nestjs/common'; import { UserService } from './user.service'; @Controller('user') export class UserService { @Delete(':sid') deleteUser(@Param('sid') sid: string) { return this.userService.deleteUser(sid); } }
使用 postman 看下效果
可以看到發(fā)送 delete 請求 請求成攻。
讀到這里,這篇“node中的Nest.js框架怎么用”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。