【前端】嘿,Nest.js實戰開發系列之 Nest.js初體驗
寫在前面前面從小白視角學習了Typescript,并學習總結了ts的系列文章,希望能夠對于讀者有所幫助。至于學習了TS基礎后,如何進行開發實踐,本系列將結合Nest.js的Node服務器框架進行娓娓道來。
- Nest (NestJS) 是一個用于構建高效、可擴展的Node.js服務器端應用程序的框架。它使用漸進式 JavaScript,使用TypeScript構建并完全支持(但仍然允許開發人員使用純 JavaScript 進行編碼)并結合了 OOP(面向對象編程)、FP(函數式編程)和 FRP(函數式響應式編程)的元素。
Nest使用了功能強大的HTTP Server框架,默認支持Express框架,其是簡單易上手的。Nest是在Express上進行抽象而成的,結合TS強大的語言體系實現高效快捷開發。
Nest是筆者繼接觸Express框架后感興趣的Node框架,對此還是比較熟悉的,選擇Nest也就簡單易行。截止到筆者發布文章的時候,Github上Nest擁有37.7K個Stat,足以證明其受青睞程度。
Nest 提供開箱即用的應用程序架構,允許開發人員和團隊創建高度可測試、可擴展、松散耦合且易于維護的應用程序。該架構深受 Angular 的啟發。
項目創建
開發環境
在項目開展前,先行介紹下開發環境:
- node.js:14.15.1
- typescript:3.8.3
- nest.js:7.6.15
先決條件請確保您的操作系統上安裝了Node.js(>= 10.13.0,v13 除外)。
創建項目
要使用 Nest cli創建項目,先得安裝相關腳手架,運行下列命令創建第一個Nest項目。
- $ npm i -g @nestjs/cli
- $ nest new project-name
當然也可以使用yarn命令進行創建:
- $ yarn add @nest/cli
- $ nest new project-name
在輸入完上述命令后,得到以下內容:
- G:\Code>nest new nest-test
- ⚡ We will scaffold your app in a few seconds..
- CREATE nest-test/.eslintrc.js (631 bytes)
- CREATE nest-test/.prettierrc (51 bytes)
- CREATE nest-test/nest-cli.json (64 bytes)
- CREATE nest-test/package.json (1971 bytes)
- CREATE nest-test/README.md (3339 bytes)
- CREATE nest-test/tsconfig.build.json (97 bytes)
- CREATE nest-test/tsconfig.json (339 bytes)
- CREATE nest-test/src/app.controller.spec.ts (617 bytes)
- CREATE nest-test/src/app.controller.ts (274 bytes)
- CREATE nest-test/src/app.module.ts (249 bytes)
- CREATE nest-test/src/app.service.ts (142 bytes)
- CREATE nest-test/src/main.ts (208 bytes)
- CREATE nest-test/test/app.e2e-spec.ts (630 bytes)
- CREATE nest-test/test/jest-e2e.json (183 bytes)
- ? Which package manager would you ❤️ to use? yarn
- ▹▹▹▸▹ Installation in progress... ☕
上述所示,會詢問你選擇yarn還是npm進行包管理,筆者此處選擇的是yarn。
- 🚀 Successfully created project nest-test
- 👉 Get started with the following commands:
- $ cd nest-test
- $ yarn run start
- Thanks for installing Nest 🙏
- Please consider donating to our open collective
- to help us maintain this package.
- 🍷 Donate: https://opencollective.com/nest
經歷過歲月靜好,電腦后臺已經為我們負重前行,最終創建成功。
根據上述提示,我們進入項目進行操作,項目目錄如下所示:
運行yarn start或npm run start后執行運行項目,啟動項目服務。
此時,在瀏覽器地址欄輸入http://localhost:3000即可看到hello world。
詳情介紹
路由
當打開src目錄下main.ts文件時,看到@Controller()裝飾器中使用路由前綴可以更方便地進行路由分組,最大程度減少代碼重復。
main.ts
- import { NestFactory } from '@nestjs/core';
- import { AppModule } from './app.module';
- async function bootstrap() {
- const app = await NestFactory.create(AppModule);//表示使用nest的工廠函數創建了AppModule
- await app.listen(3000);//表示項目監聽的端口是3000
- }
- bootstrap();
控制器是控制傳入的請求返回到客戶端的顯示內容,當然也可以進行添加指定的路由。我們可以在app.controller.ts文件中添加以下代碼:
- @Get("/home")
- getHome(): string {
- return "my home";
- }
運行得到:
設置局部路由前綴
路由還可以設置局部和全局的前綴,使用前綴可以避免在所有路由共享通用前綴時出現沖突的情況。
在@Controller()寫入best,可以表示當前文件中所有路由設置前綴best。如下所示:
- @Controller("best")
- export class AppController {
- constructor(private readonly appService: AppService) {}
- @Get()
- getHello(): string {
- return this.appService.getHello();
- }
- }
運行結果:
設置全局路由前綴
可以在main.ts文件中添加app.setGlobalPrefix()設置全局路由前端:
- app.setGlobalPrefix('nest-test'); // 全局路由前綴
運行結果:
controller控制器
控制器負責處理傳入的請求并將響應返回給客戶端。控制器的目的是接收應用程序的特定請求。在路由該控制器接收哪些請求機構的控制。很多時候,每個控制器有多個路由,不同的路由可以執行不同的動作。

為創建一個基本的控制器,我們使用類和裝飾器。裝飾器將類與所需的元數據相關聯,并使 Nest 能夠創建路由映射(將請求綁定到相應的控制器)。
app.controller.ts
- import { Controller, Get } from '@nestjs/common';
- import { AppService } from './app.service';
- @Controller()
- export class AppController {
- constructor(private readonly appService: AppService) {}
- @Get()
- getHello(): string {
- return this.appService.getHello();
- }
- }
同樣的,我們可以使用命令進行創建新的控制器模塊,便于對項目的管理。
- $ nest g controller users
此時在src中生成了users目錄文件:
初始化的controller文件如下:
users.controller.ts
- import { Controller } from '@nestjs/common';
- @Controller('users')
- export class UsersController {}
Services業務
我們看到前面controller文件中,可以實現簡單業務邏輯的處理,但是在實際開發中應當將控制器和業務進行分開,對代碼進行解耦。
- $ nest g service users
此時在src中的users目錄下生成了業務文件:
users.service.ts
- import { Injectable } from '@nestjs/common';
- @Injectable()
- export class UsersService {
- // 添加用戶的業務邏輯
- addUser(username: string, password: string): string{
- console.log(`create user:username--${username} password--${password}`);
- return "add user success";
- }
- }
users.controller.ts
- import { Body, Controller, Post } from '@nestjs/common';
- import { UsersService }from "./users.service";
- @Controller('users')
- export class UsersController {
- constructor(private readonly usersService: UsersService) {}//Nest 是圍繞通常稱為依賴注入的強大設計模式構建的。Nest 將UsersService通過創建并返回一個實例usersService。
- @Post("add")
- addUser(@Body() body){
- return this.usersService.addUser(body.username,body.password);
- }
- }
使用postman進行模擬用戶請求,運行結果如下:
Module模塊
模塊是用@Module()裝飾器注釋的類,@Module()裝飾器提供元數據利用的組織應用程序結構。

每個應用程序至少有一個模塊和一個根模塊。根模塊是 Nest 用于構建應用程序圖的起點- Nest 用于解析模塊和提供者關系和依賴關系的內部數據結構。雖然理論上非常小的應用程序可能只有根模塊,但這不是典型情況。我們要強調的是,強烈推薦使用模塊作為組織組件的有效方式。因此,對于大多數應用程序,最終的架構將采用多個模塊,每個模塊封裝一組密切相關的功能。
所述@Module()裝飾采用單個對象,其屬性描述該模塊:
我們看到上面創建的Service和Controller是如何進行訪問運行的呢?
打開app.modelu.ts 可以看到:
- import { Module } from '@nestjs/common';
- import { AppController } from './app.controller';
- import { AppService } from './app.service';
- import { UsersController } from './users/users.controller';
- import { UsersService } from './users/users.service';
- @Module({
- imports: [],
- controllers: [AppController, UsersController],
- providers: [AppService, UsersService],
- })
- export class AppModule {}
在我們創建了子模塊后,創建了UsersController和UsersService,即使不新建module文件也能通過路由訪問,因為系統會自動添加到app.module.ts文件中。
當然,我們也可以根據需求進行創建子模塊的module文件,只需要執行下列命令即可:
- $ nest g module users
此時看到生成了module子模塊文件:
初始化的文件如下所示:
- import { Module } from '@nestjs/common';
- @Module({})
- export class UsersModule {}
此時需要將users模塊的UsersController和UsersService組裝到module文件中。這樣,其他module模塊想要引入Users模塊時,不需要同時Controller和Service了,方便對本模塊進行管理。
- import { Module } from '@nestjs/common';
- import { UsersController } from './users.controller';
- import { UsersService } from './users.service';
- @Module({
- imports: [UsersModule],
- controllers: [UsersController],
- providers: [UsersService],
- })
- export class UsersModule {}
當然,需要對app.module.ts文件進行修改,因為子模塊已經引入了Controller和Service了。
- import { Module } from '@nestjs/common';
- import { AppController } from './app.controller';
- import { AppService } from './app.service';
- // import { UsersController } from './users/users.controller';
- // import { UsersService } from './users/users.service';
- import { UsersModule } from './users/users.module';
- @Module({
- imports: [UsersModule],
- controllers: [AppController],
- providers: [AppService],
- })
- export class AppModule {}
小結
本文主要介紹使用Nest創建的首個項目,簡要講解了創建過程,以及使用到的模塊概念。對路由、控制器、業務、模塊進行了闡述,后續概念會進行詳細講解,更詳細的請見官方文檔。