在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网站。感谢您阅读我的文章。编码愉快!