NestJS是一個基于Node.js的開發架構,它結合了現代化的Web開發工具和設計模式,使得建構高效、可擴充的服務端應用變得更加容易。本文将引導您從入門到實戰,掌握NestJS的基本概念和使用方法。
download:https://www.97yrbl.com/t-1581.html
入門
首先,您需要安裝Node.js和npm。然後,打開終端并運作以下指令來建立一個新的NestJS項目:
$ npm i -g @nestjs/cli
$ nest new my-project
這将建立一個名為my-project的新項目,并自動安裝所需的依賴項。
接下來,我們可以使用以下指令啟動開發伺服器:
$ cd my-project
$ npm run start:dev
這将在本地主機上運作一個開發伺服器,預設情況下監聽3000端口。您可以在浏覽器中通路http://localhost:3000檢視預設歡迎頁面。
控制器和路由
NestJS的核心概念之一是控制器和路由。控制器是處理用戶端請求的類,而路由則定義了哪些URL路徑将由控制器處理。讓我們來建立我們的第一個控制器:
$ nest generate controller hello
這将生成一個名為hello.controller.ts的新檔案,其中包含一個名為HelloController的類。我們可以在該類中添加以下代碼:
import { Controller, Get } from '@nestjs/common';
@Controller()
export class HelloController {
@Get()
sayHello(): string {
return 'Hello, World!';
}
}
在這個例子中,我們建立了一個HelloController類,并使用@Controller()裝飾器将其标記為控制器。我們還使用@Get()裝飾器來定義該控制器将處理的路由(即根路徑)。最後,我們添加了一個名為sayHello的方法,它将傳回字元串“Hello, World!”作為響應。
現在我們可以重新啟動開發伺服器,并在浏覽器中通路http://localhost:3000,看到我們剛剛編寫的“Hello, World!”消息。
服務
另一個重要的NestJS概念是服務。服務是可注入的類,用于處理應用程式的業務邏輯。例如,我們可以使用服務來擷取資料庫資料或調用外部API。讓我們來建立一個名為hello.service.ts的新檔案,并在其中添加以下代碼:
import { Injectable } from '@nestjs/common';
@Injectable()
export class HelloService {
getHello(): string {
return 'Hello, World from service!';
}
}
在這個例子中,我們建立了一個名為HelloService的服務,并使用@Injectable()裝飾器将其标記為依賴注入類。我們還添加了一個名為getHello的方法,它将傳回字元串“Hello, World from service!”作為響應。
現在我們可以修改hello.controller.ts檔案,讓它使用我們的HelloService:
import { Controller, Get } from '@nestjs/common';
import { HelloService } from './hello.service';
@Controller()
export class HelloController {
constructor(private readonly helloService: HelloService) {}
@Get()
sayHello(): string {
return this.helloService.getHello();
}
}
在這個例子中,我們将HelloService注入到HelloController類的構造函數中,并将其執行個體存儲在私有成員變量helloService中。然後,我們修改了sayHello方法,讓它傳回HelloService的響應結果。
資料庫內建
NestJS還提供了内置的ORM(對象關系映射)工具,用于簡化與資料庫的互動。例如,我們可以使用TypeORM來連接配接到MySQL、PostgreSQL或MongoDB等資料庫。讓我們來安裝TypeORM和相關的依賴項:
$ npm install typeorm @nestjs/typeorm mysql
接下來,我們可以建立一個名為app.module.ts的新檔案,并在其中添加以下代碼:
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { Connection } from 'typeorm';
@Module({
imports: [
TypeOrmModule.forRoot({
type: 'mysql',
host: 'localhost',
port: 3306,
username: 'root',
password: '',
database: 'test',
entities: [],
synchronize: true,
}),
],
})
export class AppModule {
constructor(private readonly connection: Connection) {}
}
在這個例子中,我們建立了一個名為AppModule的子產品,并使用TypeOrmModule.forRoot()方法配置了TypeORM。我們指定了要使用的資料庫類型、主機位址、端口号、使用者名和密碼,以及要連接配接到的資料庫名稱。我們還将entities屬性設定為空數組,因為我們目前還沒有定義任何實體類。最後,我們将synchronize屬性設定為true,以便TypeORM自動建立資料庫表格。
實戰
現在,讓我們來嘗試一些更實際的用例。假設我們正在建構一個部落格應用程式,并希望實作以下功能:
擷取所有文章
擷取單篇文章
建立新文章
更新現有文章
删除文章
我們需要一個名為Post的實體類來表示文章。讓我們來建立一個名為post.entity.ts的新檔案,并在其中添加以下代碼:
import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';
@Entity()
export class Post {
@PrimaryGeneratedColumn()
id: number;
@Column()
title: string;
@Column()
content: string;
}
在這個例子中,我們使用TypeORM的裝飾器來定義Post實體類。我們将@Entity()裝飾器應用于該類,以标記它作為一個實體。我們還使用@PrimaryGeneratedColumn()裝飾器來定義一個自動生成的ID列。最後,我們添加了兩個名為title和content的列,分别用于存儲文章的标題和内容。
接下來,我們需要一個名為post.service.ts的服務類來處理文章的業務邏輯。讓我們在其中添加以下代碼:
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { Post } from './post.entity';
@Injectable()
export class PostService {
constructor(
@InjectRepository(Post)
private readonly postRepository: Repository<Post>,
) {}
async findAll(): Promise<Post[]> {
return this.postRepository.find();
}
async findOne(id: number): Promise<Post> {
return this.postRepository.findOne(id);
}
async create(post: Post): Promise<Post> {
return this.postRepository.save(post);
}
async update(id: number, post: Post): Promise<void> {
await this.postRepository.update(id, post);
}
async delete(id: number): Promise<void> {
await this.postRepository.delete(id);
}
}
在這個例子中,我們建立了一個名為PostService的服務,并使用@InjectRepository()裝飾器将Post實體類注入到該服務中。然後,我們添加了名為findAll、findOne、create、update和delete的方法,用于擷取所有文章、擷取單篇文章、建立新文章、更新現有文章和删除文章。
最後,我們需要一個名為post.controller.ts的控制器類來處理與文章相關的HTTP請求。讓我們在其中添加以下代碼:
import { Body, Controller, Delete, Get, Param, Post, Put } from '@nestjs/common';
import { PostService } from './post.service';
import { Post as PostEntity } from './post.entity';
@Controller('posts')
export class PostController {
constructor(private readonly postService: PostService) {}
@Get()
async findAll(): Promise<PostEntity[]> {
return this.postService.findAll();
}
@Get(':id')
async findOne(@Param('id') id: number): Promise<PostEntity> {
return this.postService.findOne(id);
}
@Post()
async create(@Body() post: PostEntity): Promise<PostEntity> {
return this.postService.create(post);
}
@Put(':id')
async update(@Param('id') id: number, @Body() post: PostEntity): Promise<void> {
await this.postService.update(id, post);
}
@Delete(':id')
async delete(@Param('id') id: number): Promise<void> {
await this.postService.delete(id);
}
}
在這個例子中,我們建立了一個名為PostController的控制器,并将其路由設定為“/posts”。我們使用@Get()、@Post()、@Put()和@Delete()裝飾器來定義路由,并添加了名為findAll、findOne、create、update和delete的方法,用于處理HTTP請求。
結論
通過本文的介紹,您現在應該已經掌握了NestJS的基本概念和使用方法。NestJS是一個非常強大和靈活的架構,可以幫助我們建構高效、可擴充和易于維護的服務端應用程式。如果您正在尋找一種現代化的Node.js開發架構,并且感興趣嘗試使用TypeORM、WebSocket、GraphQL等技術,那麼NestJS是一個值得考慮的選擇。