Bắt đầu với NestJS, làm thế nào để xây dựng một web servies với TypeScript và NestJS

Mở đầu

Các nhà phát triển ngày nay có nhiều lựa chọn dễ dàng khi xây dựng một web servieces và server-side application khác. Node trở thành lựa chọn phổ biến, tuy nhiên nhiều lập trình viên thích ngôn ngữ mạnh hơn Javascript, đặc biệt những ngôn ngữ có OOP giống như C#, C++ hoặc Java (chỉ cần một vài cái tên). Tuy TypeScript dùng với Nodejs khá là tốt, nhưng framwork NestJS đem nó đến một tầm cao mới, cung cấp nhưng tính năng mới nhất cho phát triển server side một cách chắc chắn và hiệu năng cao sử dụng components, providers, modules, và các tính năng cao cấp khác.

Trong bài viết này, chúng ta sẽ xem quy trình phát triển một API server đơn giản với NestJS, xử lý application cơ bản với: tạo, lưu, và trả về list dữ liệu.

Cài đặt project

Xây dụng bằng Nest yêu cầu môi trường Node. Nếu bạn không có nó, hãy đến webside của họ và tải xuống tương ứng với OS
Cài đặt framework đơn giản với lệnh:

$ npm i -g @nestjs/cli 

Trong project sẽ được tạo với công cụ Nest CLI bằng chạy lệnh sau:

$ nest new nest-js-example

Lệnh trên sẽ tạo Nest project mới vời các file cấu hình, cấu trúc thư mục, và server mâu.

Application Entry Point

File chính để cấu hình và chạy server trong src/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();

Trong file import 2 NestFactory class dùng để tạo app, cùng với file main app module chính. và bootrap được khởi động và lắng nghe ở cổng 3000.

App Module

Componnent được khai trong file src/app.module.ts:

import { Module } from '@nestjs/common';
import { ItemsController } from './items/items.controller';
import { ItemsService } from './items/items.service';

@Module({
    imports: [],
    controllers: [ ItemsController ],
    providers: [ ItemsService ],
})

export class AppModule {}

Trong server file này đóng vai trò là nơi khai báo component của ứng dùng import và khai báo một module, nó import vào file trước đó chúng ta đã xem xét. Nest cli sẽ tự động cập nhập cập nhập file này khi cần thiết, khi tạo một component mới. Dưới đây là một controller và services cho itmes được import và thêm vào module.

Items Controller

File tiếp theo cúng ta tìm đến là src/items/ítems.controller.ts:


import { Controller, Req, Get, Post, Body } from '@nestjs/common'
import { CreateItemDto } from './dto/create-item.dto'
import { ItemsService } from './items.service'
import { Item } from './items.interface'

@Controller('items')
export class ItemsController {

    constructor(private readonly itemsService: ItemsService) {}

    @Post()
    create(@Body() data: CreateItemDto): Object {
        return this.itemsService.create(data)
    }

    @Get()
    findAll(): Array<Item> {
        return this.itemsService.findAll()
    }
}

Trong file này định nghĩa controller để tạo items và hiển thị một danh sách sau khi tạo các item đó. Một số thành phần chính được liệt kê dưới đây:

  • CreateItemDto: Một đối tượng truyền dữ liệu nó định nghĩa làm sao dữ liệu Item sẽ được gửi đến network
  • ItemsService: Một Provider xử lý truyền và lưu dữ liệu Item.
  • Item: một interface định nghĩa cấu trúc dữ liệu cho một Item. Một decorator @Controller('itmes') chỉ ra cho framework của class REST endpoit là /items, và cấu trúc tìm ItemController lấy ItemsServices và sừ dùng 2 phương thức
  • Post /items
  • Get /items Request tới 2 phương thức này sẽ được xử lý bằng 2 phương thức create và findAll, và bị ràng buộc bởi phương thức HTTP bằng @Post() và @Get. Để sử dụng các phương thức được hỗ trợ với decorators với cùng một các, ví dụ như @Put() hay @Delete() vân vân.

Item Object Interfaces

Item interface định nghĩa 3 thuộc tính của item trong cửa hàng: tên, chi tiết, và giá. Điều này đảm bảo không có sự nhậm lẫn với thiết kế của app.

export interface Item {
	
    name: string,
    description: string,
    price: number
}

CreateItemDto class phản ánh các thuốc tính của Items, mỗi thuộc tính đều có một decorator @IsNotEmpty() đảm bảo tất cả chúng được yêu cầu ở REST API.

import { IsNotEmpty } from 'class-validator';

export class CreateItemDto {

    @IsNotEmpty()
    readonly name: string;

    @IsNotEmpty()
    readonly description: string;

    @IsNotEmpty()
    readonly price: number;
}

Items Service

Cuối cùng là service để tạo và trả về items, items.service.dart:

import { Injectable } from '@nestjs/common'
import { Item } from './items.interface'

@Injectable()
export class ItemsService {

    private items: Array<Item> = []

    create(item: Item): Object {

        this.items.push(item) 
        return { id: this.items.length.toString() }
    }

    findAll(): Array<Item> {

        return this.items;
    }
}

Testing it Out

Chạy server, với lệnh npm run start. Chúng ta có thể test với lệnh curl:

$ curl -X POST localhost:3000/items -d '{"name":"trinket", "description":"whatever", "price": 42.0}'

Chạy lệnh dưới sẽ trả về một JSON sau khi đã tạo itmes

$ curl localhost:3000/items

Dữ liệu chúng ta nhận được

[{"{\"name\":\"trinket\", \"description\":\"whatever\", \"price\": 42.0}":""}]

Bài viết tham khảo https://itnext.io/getting-started-with-nestjs-307556e02c8d