nestJs萌新初探

nestJs 是什麼

Nest 是一個用於構建高效,可擴展的 Node.js 服務器端應用程序的框架。它使用漸進式 JavaScript,內置並完全支持 TypeScript(但仍然允許開發人員使用純 JavaScript 編寫代碼)並結合了 OOP(面向對象編程),FP(函數式編程)和 FRP(函數式響應編程)的元素。

在底層,Nest使用強大的 HTTP Server 框架,如 Express(默認)和 Fastify。Nest 在這些框架之上提供了一定程度的抽象,同時也將其 API 直接暴露給開發人員。這樣可以輕鬆使用每個平臺的無數第三方模塊。

文檔

https://docs.nestjs.cn/9/firststeps

https://www.nestjs.com.cn/

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 社區。

文檔:

https://www.fastify.cn/

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,方便切換版本

https://nvm.uihtm.com/

Nest Cli 創建項目

使用 Nest CLI 建立新項目非常簡單。 在安裝好 npm 後,您可以使用下面命令在您的 OS 終端中創建 Nest 項目:

全局安裝 Nest Cli 工具

npm i -g @nestjs/cli

創建項目

nest new project-name

例:

nest new nest_test

項目目錄結構

image-20230330151141422

如上圖所示

目錄中包含幾個核心文件。

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 平臺:expressfastify。您可以選擇最適合您需求的產品。

platform-express Express 是一個衆所周知的 node.js 簡約 Web 框架。 這是一個經過實戰考驗,適用於生產的庫,擁有大量社區資源。 默認情況下使用 @nestjs/platform-express 包。 許多用戶都可以使用 Express ,並且無需採取任何操作即可啓用它。
platform-fastify Fastify 是一個高性能,低開銷的框架,專注於提供最高的效率和速度。 在這裏閱讀如何使用它。

無論使用哪種平臺,它都會暴露自己的 API。 它們分別是 NestExpressApplicationNestFastifyApplication

將類型傳遞給 NestFactory.create() 函數時,如下例所示,app 對象將具有專用於該特定平臺的函數。 但是,請注意,除非您確實要訪問底層平臺 API,否則無需指定類型。

const app = await NestFactory.create<NestExpressApplication>(AppModule);

啓動Nest 項目

安裝過程完成後,您可以在系統命令行工具中運行以下命令,以啓動應用程序:

$ npm run start

此命令啓動 HTTP 服務監聽定義在 src/main.ts 文件中定義的端口號。在應用程序運行後, 打開瀏覽器並訪問 http://localhost:3000/。 你應該看到 Hello world! 信息。

image-20230330151213119

要監聽文件中的更改,您可以運行以下命令來啓動應用程序:

$ npm run start:dev

此命令將監聽您的文件,自動重新編譯並重新加載服務器。

學習資料

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章