天天看點

NestJS 入門到實戰 前端必學服務端新趨勢完結wu密與爾同銷萬古愁

作者:大道至簡91
NestJS 入門到實戰 前端必學服務端新趨勢完結wu密與爾同銷萬古愁

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 入門到實戰 前端必學服務端新趨勢完結wu密與爾同銷萬古愁

控制器和路由

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 入門到實戰 前端必學服務端新趨勢完結wu密與爾同銷萬古愁

服務

另一個重要的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();

}

}

NestJS 入門到實戰 前端必學服務端新趨勢完結wu密與爾同銷萬古愁

在這個例子中,我們将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是一個值得考慮的選擇。