Nest 是什么?
? ? ? ? 問你一個問題,node是不是把js拉出來瀏覽器環境運行了?當然,他使用了v8引擎加上自己的底層模塊從而實現了,在外部編輯處理文件等;然后它使用很多方式來發送請求是吧,你知道的什么http.request
或 https.request
; 我們瀏覽器中,使用AJAX以及封裝AJAX和http的Axios;再后來又有了處理http請求的東西,包括express,koa這種框架,是吧,也就是說,你不僅可以使用node發送請求,也可以處理請求,實現編寫后端,文件處理,是不是?
? ? ? ? 但是本人用過express,怎么說呢,感覺寫了一大堆東西,亂七八糟,還就是一個基本的請求處理
????????koa我就不說了,洋蔥模型挺不錯的,但是感覺好像又是小作坊的東西,,,,沒有一點規范和社區支持,所以node推出了,新一代的處理請求的框架,nest.js
? ? ? ? 他有太多的好處了基于 TypeScript + OOP + FP + DI(面向對象+函數式+依賴注入)以及企業級支持能力,支持 MVC、REST、GraphQL、WebSocket、微服務架構,支持 Swagger 文檔生成、配置文件、日志系統等等太多了,但其實他的http處理默認也是依據express的,但是你可以換fastify
nest-cli
????????
? ? ? ? 這里nest的官方腳手架,就是企業級的開發模板,我們使用npm安裝一下,然后使用nest new XXX創建一個項目吧,我選的是npm包管理器
? ? ? ? 他還有很多命令,你可以使用nest? --help 查看哦
? ? ? ? 這里就是創建好了,我們進入看看
這都是什么?
idea是我的編輯器配置
node_module 是需要用到的包
src 是項目的根目錄
test? 是測試文件
README 是項目描述
nest-cli.json 是腳手架的配置文件
其他的就是關于prettierrc,ts以及eslint的規范的文件了,其他的我們不用看了,我們之所以所有的代碼都是紅的,就是因為我們有創建git 環境,我們添加后就綠了
那我們寫代碼的時候在哪里呢?現在在src目錄下,我們隨便打開一個文件,發現全是報錯,怎么辦?
這是我們的規范插件prettierrc 的問題,怎么辦?直接忽略掉,創建一個.prettierignore文件,直接寫一個*忽略所有即可,這就不報錯了
Main
?
? ? ? ? 在這里就是對于整個nest項目的一些配置了
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';// 新建的實例方法
async function bootstrap() {// 創建實例const app = await NestFactory.create(AppModule);// 監聽的端口await app.listen(process.env.PORT ?? 3000);
}
bootstrap();
Module
? ? ? ? src下的module是什么?什么是nest的module?簡單說,他是它是一個封裝和組織應用功能的容器,每個模塊包含了控制器、服務、提供者,管道等內容,負責管理應用中的一部分功能;就是用來管理和調配這個模塊的所有東西的
? ? ? ? 一般包括Imports:導入其他模塊,形成模塊之間的依賴關系;Controllers:處理請求和返回響應,負責調用服務;Providers(通常是 Service):處理業務邏輯,返回結果;Exports:將模塊的某些功能(如服務)導出,以便其他模塊使用
? ? ? ? 他就是好比一個公司的董事會,他說,我們公司啊,供應商用這個,我們提供什么服務?別人來找我們合作了,我讓那個部門出來處理他們的需求!!! 可以理解了吧
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';@Module({imports: [], //導入第三方模塊服務使用的,和使用import導入包有異曲同工之妙controllers: [AppController], //處理本模塊使用到的處理http請求providers: [AppService], //對應著處理http請求的方法
})
export class AppModule {}
Controller?
? ? ? ? 這是什么?這就是你的所有的請求分發處理的地方,好比什么呢,剛剛的公司董事會說:我們現在有一個合作商,他的產品出問題了,對應的產品售后支持部門就出來應對了;我們有新的客戶了,這時候市場部就出來應對了,理解了吧,就是合適的事,交給合適的部門;
? ? ? ? 當然了,在這里他還有一個作用,那就是處理我們請求中的數據,客戶來了,提出的問題,你不得格式化成自己公司的流程再分發給各部門嗎?
import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';@Controller()
export class AppController {constructor(private readonly appService: AppService) {}@Get() //處理get請求getHello(): string {return this.appService.getHello(); //對應的處理邏輯}
}
? ? ? ? 這里有很多的裝飾器,什么是裝飾器,就是ts中說的,我們在不改變一個東西的邏輯的情況下,給他的屬性或邏輯添加點東西,這就是修飾符,分為方法修飾符,類修飾符,屬性修飾符,參數修飾器,訪問器修飾器等
? ? ? ? 在nest中,處理get請求,處理post,delete,put,patch等等請求,都有對應的裝飾器就是@開頭的,@Controller也是裝飾器,你看到了沒
? ? ? ? 那你說,寫一個post請求怎么寫?就是這么簡單,然后把真正處理的邏輯寫在service里
Service
????????Service 負責處理實際的業務邏輯,對應的就是各個處理事情的部門了,到這里我們梳理一下哈
? ? ? ? 董事會(module)協調所有的事情,然后把各個突發的事件下發(contorller)各部門,然后各部門詳細的處理(Service)這些事件,到此OK了
import { Injectable } from '@nestjs/common';@Injectable()
export class AppService {getHello(): string { //處理業務的方法return 'Hello World!';}
}
? ? ? ? 書接上回的Post的處理方法
項目運行?
? ? ? ? 我們使用npm run start:dev即可運行項目了,使用postman測試一下
????????這樣的是運行起來了,如果報錯了,大多數是端口占用了,你去main里換個端口即可
????????有人說,那我們的請求方式在哪里啊,就是在你的contorller中,你自己寫的請求裝飾器,你不是還寫了一個post的請求嗎,你把postman切換使用post請求方式試試
? ? ? ? 那我們的請求地址是什么,一般來說,你還沒有上線到服務器,所以就是本機的ip+項目的端口+請求地址,假如我們給contorller一個路徑呢?你看好?,那你的請求就要換地址了
? ? ? ? 一般來說,響應的內容也是我們自己定義的,只不過我們現在沒有那么多的邏輯呢,我們先在service里改一下,讓你看看,是不是他使用contorller分發請求,使用service處理邏輯的
結語
module,service,contorller就是拉動nest運行的三架馬車,這是最最基本的東西了,下次講解
cli的完全使用,以及nest的底層邏輯
大家有沒有想過為什么我的名字叫全棧到失業?
因為Nest地位有點尬,你想,我一個公司,要寫前端和后端,java存在幾十年了,那么的成熟的技術,完善的社區,以及處理高并發和微服務的生態鏈,他不是一天兩天可以替代的,但是你說為什么java也在失業呢?這就是國內的現狀了,就是市面上,除了一些自研公司,其他的都是外包,寫來寫來就是CRUD,m沒有創新點,其次就是國人基數太大了,14億人,一年1000w畢業的,不得有10wjava專業的?市場怎么吸納那么多人啊?
那Nest為什么會存在?因為Nest(Node.js)解決的是“更快、更輕、更靈活”的問題,他的編碼速度,啟動速度都比java快,而且使用前端ts的語法,前端也可以寫后端,而且現在nest的微服務,高并發生態也不錯啊.所以他其實很適合中小企業的后端開發的,可是,國內太少一肩挑的了,只能期望自己越來越強吧,加油!