nestJs 是什麼
Nest 是一個用於構建高效,可擴展的 Node.js 服務器端應用程序的框架。它使用漸進式 JavaScript,內置並完全支持 TypeScript(但仍然允許開發人員使用純 JavaScript 編寫代碼)並結合了 OOP(面向對象編程),FP(函數式編程)和 FRP(函數式響應編程)的元素。
在底層,Nest使用強大的 HTTP Server 框架,如 Express(默認)和 Fastify。Nest 在這些框架之上提供了一定程度的抽象,同時也將其 API 直接暴露給開發人員。這樣可以輕鬆使用每個平臺的無數第三方模塊。
文檔
https://docs.nestjs.cn/9/firststeps
nestJs 內置框架
express
文檔Express - 基於 Node.js 平臺的 web 應用開發框架 - Express 中文文檔 | Express 中文網
Fastify
- 高性能: 據我們所知,Fastify 是這一領域中最快的 web 框架之一,另外,取決於代碼的複雜性,Fastify 最多可以處理每秒 3 萬次的請求。
- 可擴展: Fastify 通過其提供的鉤子(hook)、插件和裝飾器(decorator)提供完整的可擴展性。
- 基於 Schema: 即使這不是強制性的,我們仍建議使用 JSON Schema 來做路由(route)驗證及輸出內容的序列化,Fastify 在內部將 schema 編譯爲高效的函數並執行。
- 日誌: 日誌是非常重要且代價高昂的。我們選擇了最好的日誌記錄程序來儘量消除這一成本,這就是 Pino!
- 對開發人員友好: 框架的使用很友好,幫助開發人員處理日常工作,並且不犧牲性能和安全性。
- 支持 TypeScript: 我們努力維護一個 TypeScript 類型聲明文件,以便支持不斷成長的 TypeScript 社區。
文檔:
IOC控制反轉 DI依賴注入
在學習nestjs 之前需要先了解其設計模式
IOC
Inversion of Control字面意思是控制反轉,具體定義是高層模塊不應該依賴低層模塊,二者都應該依賴其抽象;抽象不應該依賴細節;細節應該依賴抽象。
DI
依賴注入(Dependency Injection)其實和IoC是同根生,這兩個原本就是一個東西,只不過由於控制反轉概念比較含糊(可能只是理解爲容器控制對象這一個層面,很難讓人想到誰來維護對象關係),所以2004年大師級人物Martin Fowler又給出了一個新的名字:“依賴注入”。 類A依賴類B的常規表現是在A中使用B的instance。
案例
未使用控制反轉和依賴注入
class A {
name: string
constructor(name: string) {
this.name = name
}
}
class B {
age:number
entity:A
constructor (age:number) {
this.age = age;
this.entity = new A('makalo')
}
}
const c = new B(18)
c.entity.name
我們可以看到,B 中代碼的實現是需要依賴 A 的,兩者的代碼耦合度非常高。當兩者之間的業務邏輯複雜程度增加的情況下,維護成本與代碼可讀性都會隨着增加,並且很難再多引入額外的模塊進行功能拓展。
爲了解決這個問題可以使用IOC容器
使用IOC 容器
class A {
name: string
constructor(name: string) {
this.name = name
}
}
class C {
name: string
constructor(name: string) {
this.name = name
}
}
//中間件用於解耦
class Container {
modeuls: any
constructor() {
this.modeuls = {}
}
provide(key: string, modeuls: any) {
this.modeuls[key] = modeuls
}
get(key) {
return this.modeuls[key]
}
}
const mo = new Container()
mo.provide('a', new A('makalo 1'))
mo.provide('c', new C('makalo 2'))
class B {
a: any
c: any
constructor(container: Container) {
this.a = container.get('a')
this.c = container.get('c')
}
}
new B(mo)
其實就是寫了一箇中間件,來收集依賴,主要是爲了解耦,減少維護成本
NestJs的前置知識__TS裝飾器
參考:https://www.cnblogs.com/makalochen/p/17269716.html
Nest Cli工具
前置條件
$node -v
v16.18.1
$ npm -v
7.x.x
建議使用nvm,方便切換版本
Nest Cli 創建項目
使用 Nest CLI 建立新項目非常簡單。 在安裝好 npm 後,您可以使用下面命令在您的 OS 終端中創建 Nest 項目:
全局安裝 Nest Cli 工具
npm i -g @nestjs/cli
創建項目
nest new project-name
例:
nest new nest_test
項目目錄結構
如上圖所示
目錄中包含幾個核心文件。
src
├── app.controller.spec.ts
├── app.controller.ts
├── app.module.ts
├── app.service.ts
└── main.ts
以下是這些核心文件的簡要概述:
文件 | 含義 |
---|---|
app.controller.ts | 帶有單個路由的基本控制器示例。 |
app.controller.spec.ts | 對於基本控制器的單元測試樣例 |
app.module.ts | 應用程序的根模塊。 |
app.service.ts | 帶有單個方法的基本服務 |
main.ts | 應用程序入口文件。它使用 NestFactory 用來創建 Nest 應用實例。 |
main.ts
main.ts
包含一個異步函數,它負責引導我們的應用程序
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
await app.listen(3000);
}
bootstrap();
要創建一個 Nest 應用實例,我們使用了 NestFactory
核心類。
NestFactory
暴露了一些靜態方法用於創建應用實例。
create()
方法返回一個實現 INestApplication
接口的對象。
該對象提供了一組可用的方法,我們會在後面的章節中對這些方法進行詳細描述。
在上面的 main.ts
示例中,我們只是啓動 HTTP 服務,讓應用程序等待 HTTP 請求。
請注意,使用 Nest CLI 搭建的項目會創建一個初始項目結構
平臺
Nest 旨在成爲一個與平臺無關的框架。 由於平臺無關性,我們以創建可重用的邏輯組件,開發人員可以跨越多種不同類型的應用程序來使用這些組件。 從技術上講,創建了適配器以後,Nest 可以與任何 node.js 的 HTTP 框架一起工作。有兩個支持開箱即用的 HTTP 平臺:express 和 fastify。您可以選擇最適合您需求的產品。
platform-express | Express 是一個衆所周知的 node.js 簡約 Web 框架。 這是一個經過實戰考驗,適用於生產的庫,擁有大量社區資源。 默認情況下使用 @nestjs/platform-express 包。 許多用戶都可以使用 Express ,並且無需採取任何操作即可啓用它。 |
platform-fastify | Fastify 是一個高性能,低開銷的框架,專注於提供最高的效率和速度。 在這裏閱讀如何使用它。 |
無論使用哪種平臺,它都會暴露自己的 API。 它們分別是 NestExpressApplication
和 NestFastifyApplication
。
將類型傳遞給 NestFactory.create() 函數時,如下例所示,app 對象將具有專用於該特定平臺的函數。 但是,請注意,除非您確實要訪問底層平臺 API,否則無需指定類型。
const app = await NestFactory.create<NestExpressApplication>(AppModule);
啓動Nest 項目
安裝過程完成後,您可以在系統命令行工具中運行以下命令,以啓動應用程序:
$ npm run start
此命令啓動 HTTP 服務監聽定義在 src/main.ts
文件中定義的端口號。在應用程序運行後, 打開瀏覽器並訪問 http://localhost:3000/
。 你應該看到 Hello world!
信息。
要監聽文件中的更改,您可以運行以下命令來啓動應用程序:
$ npm run start:dev
此命令將監聽您的文件,自動重新編譯並重新加載服務器。