Как создать простой и масштабируемый веб-API с помощью Nest.js и Typescript?
Прежде чем приступить к работе с 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.