Как создать простой и масштабируемый веб-API с помощью Nest.js и Typescript?

Опубликовано: 29 Декабря, 2022

Прежде чем приступить к работе с Nest.js, мы рекомендуем сначала прочитать эту статью: ExpressJS против NestJS.

Зачем изучать Nest.js?

У нас есть много серверных фреймворков JavaScript, так что же в нем особенного Nest? Видите ли, существует множество JavaScript-библиотек, помощников и инструментов для Node.js, но ни один из них не решает проблему обслуживания базы кода. Да, поддержка кодовой базы так же важна, как и поддержание производительности сервера. Nest.js обеспечивает лучшую архитектуру с точки зрения масштабирования. Nest.js лучше всего подходит для микросервисов. Nest.js полностью поддерживает TypeScript и обладает лучшей обработкой ошибок на рынке. Поддерживать приложение Nest.js очень просто!

“Nest provides an out-of-the-box application architecture which allows developers and teams to create highly testable, scalable, loosely coupled, and easily maintainable applications. The architecture is heavily inspired by Angular.” 

Давайте начнем! Мы постараемся сделать эту статью короткой и легкой. Вы можете найти мой репозиторий GitHub в конце этой статьи. Мы будем создавать веб-API для работы с Nest.js.

Монтаж:

Шаг 1: Установить Nest.JS довольно просто. Мы будем использовать менеджеры пакетов для установки Nest.

$ npm i -g @nestjs/cli

Шаг 2: После глобальной установки Nest мы можем создать наш проект с помощью следующей команды.

$ nest new task-api

Шаг 3: Чтобы запустить приложение, введите команды вложения.

$ cd task-api
$ npm install
$ npm run start

Шаг 4: Найдите файлы ядра в каталоге src/ . После успешной установки вы найдете:

  • main.ts
  • app.controller.ts
  • приложение.service.ts
  • app.module.ts

Примечание:

  • Модули — это основные строительные блоки в Nest.js.
  • Каждый модуль в Nest.js содержит три файла: « controller.ts», «service.ts», «module.ts».
  • Модуль приложения является корневым модулем веб-приложения на стороне сервера и содержит другие модули.

Структура проекта: проект должен выглядеть следующим образом:

Шаги по созданию веб-API с использованием Nest.js и Typescript: выполните следующие шаги один за другим, чтобы создать веб-API:

Шаг 1: Давайте создадим Task Module в нашем приложении с помощью команды Nest CLI:

$ nest generate module Task

Внутри папки задач вы найдете аналогичную структуру папок корневого модуля. Внутри файла task.module.ts вы найдете:

Javascript




import { Module } from "@nestjs/common";
import { TaskController } from "./task.controller";
import { TaskService } from "./task.service";
  
@Module({
    controllers: [TaskController],
    providers: [TaskService],
    imports: [
    ],
})
export class TaskModule { }

Nest.js автоматически создает необходимые контроллеры и служебные файлы для первоначальной разработки.

Шаг 2: Создайте папку «dtos» в « /src/Task ». и добавьте файл « task.dto.ts» .

Примечание. DTO обозначают объекты передачи данных. DTO необходим для проверки данных в каждом запросе, поэтому мы используем библиотеку class-validator.

$ npm install class-validator

См. код ниже:

Javascript




import { IsInt, IsString, IsDate, IsNotEmpty, IsOptional } from "class-validator";
  
export class Task {
    @IsInt()
    @IsOptional()
    id: number;
  
    @IsString()
    @IsNotEmpty()
    readonly title: string;
  
    @IsString()
    @IsOptional()
    description;
  
    @IsOptional()
    @IsDate()
    @IsNotEmpty()
    createdOn;
}

Шаг 3: Добавьте методы в файл « task.service.ts» . Мы будем хранить задачи в массиве локально на сервере, чтобы сохранить простоту статьи.

Службы содержат методы, реализующие бизнес-логику. Простые функции JavaScript отвечают за передачу и обработку данных.

Javascript




import { Task } from "src/dtos/task.dto";
import { HttpException, HttpStatus, Injectable } from "@nestjs/common";
  
@Injectable()
export class TaskService {
  
    // We will be storing our task in this array, 
    // to maintain simplicity of this article 
  
    private tasks: Task[] = [];
  
    // We will be using these methods in 
    // our Task controller. 
  
    addTask(task: Task): Task {
        const taskToAdd: Task = {
            title: task.title,
            id: this.tasks.length + 1,
            description: task.description,
            createdOn: new Date(),
        };
        this.tasks.push(taskToAdd);
        return taskToAdd;
    }
  
    listTaskById(id: number): Task {
        const result = this.tasks.find((item) => item.id === id);
        if (result) {
            return result;
        } else {
            throw new HttpException(
                "Task not found", HttpStatus.FORBIDDEN);
        }
    }
}

Шаг 4: Добавьте методы в файл task.controller.ts .

Контроллер — это простой класс с декоратором @Controller('task'), который указывает, что он будет прослушивать запросы, сделанные в конечной точке '/src/Task'. Для обработки различных методов HTTP-запросов NestJS предоставляет нам методы: @Get, @Post, @Put(), @Delete(), @Patch().

Javascript




import {
    Body,
    Controller,
    Get,
    Post,
    Param,
    ParseIntPipe,
    Request,
} from "@nestjs/common";
import { Task } from "./interfaces/task.dto";
import { TaskService } from "./task.service";
  
@Controller("task")
export class TaskController {
    constructor(private taskService: TaskService) { }
  
    // It will handle all HTTP POST Requests made 
    // to "/task" endpoint from client.
    @Post()
    async addTask(@Body() task: Task) {
        const addedTask = this.taskService.addTask(task);
        return addedTask;
    }
  
    // It will handle all HTTP GET Requests made 
    // to "/task" endpoint from client.
    @Get(":id")
    async listTaskById(@Param("id", ParseIntPipe) id: number) {
        if (id) {
            return this.taskService.listTaskById(id);
        }
        return "Id not found!";
    }
}

Шаг 5: Настройте файл «task.module.ts» в папке «/src/Task» и добавьте поставщиков и контроллеры.

Javascript




import { Module } from "@nestjs/common";
import { TaskController } from "./task.controller";
import { TaskService } from "./task.service";
  
  
@Module({
    controllers: [TaskController],
    providers: [TaskService],
    imports: [
        // Nothing to import in task module
    ],
})
export class TaskModule { }

Шаг 6: Настройте файл «app.module.ts» в папке « /src » и импортируйте модуль Task.

Javascript




import { Module } from "@nestjs/common";
import { AppController } from "./app.controller";
import { AppService } from "./app.service";
import { TaskModule } from "./task/task.module";
  
@Module({
    imports: [TaskModule],
    controllers: [AppController],
    providers: [AppService],
})
export class AppModule { }

Шаг 7: Убедитесь, что у вас есть аналогичный код в «/src/main.ts». Этот код инициализирует наш веб-API.

Javascript




import { ValidationPipe } from "@nestjs/common";
import { NestFactory } from "@nestjs/core";
import { useContainer } from "class-validator";
import { AppModule } from "./app.module";
  
async function bootstrap() {
    const app = await NestFactory.create(AppModule);
    app.useGlobalPipes(new ValidationPipe(
        { whitelist: true, transform: true }));
    await app.listen(3000);
}
bootstrap();

Шаги для запуска приложения: теперь мы готовы запустить наш веб-API NestJS на локальном хосте/3000:

$ nest start

Вывод: мы будем использовать Postman для тестирования Nest.JS Task Web API. Вы можете протестировать его с помощью Postman или открыть URL-адрес в браузере.

1. Сделайте запрос POST на конечной точке «http://localhost:3000/task» в Postman, как показано ниже:

2. Сделайте запрос GET на конечной точке «http://localhost:3000/task/1» в Postman, как показано ниже:

Надеюсь, вам понравилась эта статья, вы можете проверить код в репозитории GitHub.