认识NestJS

在Node.js开发人员课程启动之前,准备了本文的翻译




现代开发人员在创建Web服务和其他服务器应用程序时有许多选择。 Node已成为一种非常流行的选择,但是,许多程序员都比JavaScript更健壮的语言,特别是那些来自现代面向对象语言(例如C#,C ++或Java)的语言。如果打字稿只是西装的NodeJS就好了,那么NestJS框架需要到一个全新的水平,为后端开发人员创建使用的部件,供应商,模块和其他有用的高级抽象耐用和高性能应用提供了现代化的工具。

在本文中,我们将研究在NestJS上创建一个简单的API服务器以处理基本的应用场景的过程:创建,存储和检索超市产品列表。
如果您想熟悉项目的源代码,可以在这里找到它

项目创建


要使用Nest,您需要一个Node环境。如果您还没有,请访问他们的网站并下载。

安装框架非常简单:

$ npm i -g @nestjs/cli

运行以下命令后,使用Nest CLI创建了该项目:

$ nest new nest-js-example

这样的团队将使用必要的配置文件,文件夹结构和服务器模板创建一个全新的Nest项目。

申请入口


配置和启动服务器的主要文件是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();

该文件导入用于创建应用程序NestFactory和主AppModule文件(我们将很快见到),然后下载该应用程序,对其进行实例化并在端口3000上进行侦听。

应用模块


声明应用程序组件的文件称为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 {}

这是在模块中导入其他组件并声明的文件,该文件在以前的文件(main.ts)中导入当指示创建新组件时Nest CLI工具将根据需要自动更新此文件。这里,控制器和服务项目均采用进口和添加到模块。

项目控制器


我们将检查的下一个文件是src/items/items.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()
    }
}

该文件定义用于创建项目并获取先前创建的项目的列表的控制器这里导入了几个关键组件:

  • CreateItemDto:一个Data-Transfer对象,该对象定义如何通过网络发送商品数据(即,这是JSON数据结构);
  • ItemsService:处理Item数据的操作或存储的提供程序
  • Item:一个接口,用于定义Item的内部数据结构

装饰器@Controller('items')告诉框架该类将为REST / items端点提供服务,而ItemsController构造函数采用ItemsService的实例,该实例在内部用于提供两种HTTP方法:

  • POST / items(根据JSON请求创建一个新项目);
  • GET /项目(获取以前创建的项目的列表)。

这两个方法的请求由create和FindAll方法处理,它们使用@Post()装饰器绑定到相应的HTTP方法@Get()装饰器也可以类似的方式支持其他方法,例如@Put()@Delete(),等等。

项目对象接口


接下来,我们将处理两个文件,这些文件定义用于存储item的接口,一个文件供内部使用,例如在编译时进行类型检查(Item),以及一个用于确定传入JSON的预期结构的外部接口(CreateItemDto):

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

export class CreateItemDto {

    @IsNotEmpty()
    readonly name: string;

    @IsNotEmpty()
    readonly description: string;

    @IsNotEmpty()
    readonly price: number;
}

Item 界面定义常规商店产品的三个属性:名称,描述和价格。这样可以确保在应用程序体系结构中不会混淆项目的含义和属性。CreateItemDto

反映Item属性,装饰每个属性以确保REST API端点请求所有这些属性。@IsNotEmpty()

这两个类的所有属性都是强类型的,这是TypeScript的主要优点之一(因此得名)。乍一看,这可以提高对上下文的理解水平,并在与代码分析工具(例如VSCode中的IntelliSense)正确使用时显着减少开发时间。对于具有数百甚至数千个不同类和接口的大型项目来说尤其如此。对于那些没有无限能力的完美摄影记忆的人(例如,对我而言),这比试图记住成千上万个特定细节要容易得多。

物品服务


最新的是用于创建和接收的服务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;
    }
}

ItemsService定义一个简单的Item对象数组,数组将用作示例项目的内存中数据存储。从该存储库写入和读取的两种方法是:

  • 创建(将Item保存到列表中并返回其ID);
  • findAll(返回先前创建的Item对象的列表)。

测试中


要启动服务器,请使用标准的npm run start命令启动应用程序后,可以通过CURL发送HTTP请求来对其进行测试

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

执行此命令将返回JSON响应,其中包含item生成ID要显示已创建的项目列表,请使用:

$ curl localhost:3000/items

上述/ 项目的GET请求将返回JSON响应,其中包含有关内存中已存在项目的信息答案应如下所示:

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

结论


NestJS是后端开发领域中的一个相对较新的解决方案,它具有用于快速构建和部署满足现代应用程序客户要求并遵循SOLID原则十二个要素的应用程序的公司服务的大量功能

要了解更多信息,请访问NestJS网站
感谢您阅读我的文章。编码愉快!

All Articles