NestJS是一个服务器端(后端)应用程序框架,旨在支持开发人员的工作效率并让他们的生活更快乐。好吧,它不仅仅是一个框架,它还是高级工程概念领域的推动者,如领域驱动设计、事件溯源、微服务架构等。所有包都以简单轻量级的形式打包,以便您可以选择-无论您决定使用整个框架或只是重新使用其组件。我是用PHP编写的Symfony框架的粉丝。在我的职业生涯中,我花了几年时间开发大型应用程序,它并没有让我失望。它写得很好,作为一个客观的、有据可查的、模块化的Web框架,它提供了很好的开发人员体验。正如我描述的NestJS。Node.js和包管理器NPM为开发人员提供了一个功能齐全的服务器端环境,该环境灵活、快速且非常灵活,将开发到生产的时间缩短到数小时,而不是几天。然而,尽管Node.js有很多优点,但它并没有解决最常见的问题,在我看来这是所有现代NodeJS框架似乎都欠缺的最大问题——架构灵活性。有人可能会说——决定项目架构的不是框架问题。好吧,我完全同意这一点,但我们几乎在每个项目中都会看到一些众所周知的概念和模式。在我看来,如果一个框架能推动开发人员做出好的架构决策,那是一件好事。NestJS到底是什么?根据该项目的网站:NEST是一个用于构建高效、可扩展的NodeJS服务器端应用程序的框架。这是与Node.js相同的语言,那么有什么区别呢?好吧,重点在于细节:它使用现代JavaScript,使用Typescript构建(保留与纯JavaScript的兼容性),并结合了OOP、FP和FRP的元素。就是这样。Nest框架鼓励开发者以非常积极的方式去试验、学习和使用一些著名的软件工程范式。这不仅仅是一个介绍性的标语——在项目文档中,我们找到了许多示例、指南和代码源,以便我们可以在几分钟内在我们的项目中使用它们。此外,NestJS的所有这些新词汇都为我们提供了它背后的知识。因此,如果您不了解某些模式-别担心,整个过程都没有问题。一些特性NestJS是一个完全用TypeScript编写的框架(它也支持JS),它很容易测试并带来了所有你总是需要的东西,但你不知道该选什么。DependencyInjectionContainer-NestJS带有自己的DiC,一个似乎在JavaScript世界中被遗忘的实用程序,但我真的离不开它。有Inversify或Bottle等解决方案,但NestJS有自己的解决方案。它还支持工厂注入。模块化——在NestJS中,同一域边界内的应用程序的每个逻辑部分都是一个模块,这鼓励封装。可测试性——由于引入了DiC和模块化,您可以针对服务构建应用程序,使控制器的工作更易于测试。使用TypeScript-类型很好。您可以将类型分配给变量,从而减少可能的错误。入门:构建一个简单的天气应用程序在本文中,我们将使用Nest框架和OpenWeatherMapAPI编写一个简单的天气应用程序。准备项目首先,让我们确保安装了受支持的Node.js版本:node-v需要高于6.11.0。如果您没有安装Node.js或版本不对,请安装或更新。第二步是从OpenWeatherMap网站检索API密钥。为了实现我们需要注册的功能,在成功注册后,我们将能够从API密钥选项卡中检索我们的API密钥。准备好出发。让我们建立这个项目。为此,我将使用Nest的TypeScript入门存储库(还有一种方法可以从头开始构建项目,但我很懒)。它提供了良好的初学者体验,并拥有开始编码所需的一切。$gitclonehttps://github.com/nestjs/typescript-starter.gitproject$cdweather-app/安装依赖项并启动:$npmi$npmrunstart当项目依赖项安装完成并且应用程序成功启动时,你应该会在控制台中看到以下输出,将浏览器指向urlhttp://localhost:3000/应该会给您一个热烈欢迎的HelloWorld!文本。>nest-typescript-starter@1.0.0start/Users/mat/Development/weather-app>nodeindex.js[Nest]31827-2018-1-1311:39:32[NestFactory]??启动Nest应用程序...[Nest]31827-2018-1-1311:39:32[InstanceLoader]ApplicationModule依赖项已初始化+7ms[Nest]31827-2018-1-1311:39:32[RoutesResolver]AppController{/}:+34ms[Nest]31827-2018-1-1311:39:32[RouterExplorer]Mapped{/,GET}route+2ms[Nest]31827-2018-1-1311:39:32[NestApplication]Nest应用成功启动+1ms安装HTTP客户端我们已经设置了项目,获得了天气数据的API密钥和开发服务器,准备交付。我们现在安装一个HTTP客户端,我个人在这方面的偏好是axios。为什么选择Axios?它是一个基于Promise的客户端,同时支持服务器端和客户端,并提供许多有用的功能,例如:自动响应JSON转换和专用工具-moxios-使测试变得顺畅和简单。$npmi--saveaxiosbuildfirstservice现在我们可以开始构建我们的第一个服务为此,让我们在src/文件夹中创建一个名为weather.service.ts的文件:import{Component}from'@nestjs/common';importaxios,{AxiosInstance}from'axios';@Component()exportclassWeatherService{privateclient:AxiosInstance;constructor(){this.client=axios.create({baseURL:'https://api.openweathermap.org/data/2.5/',params:{APPID:'CHANGE_ME'}});}asyncofCity(city:string):object{constresponse=awaitthis.client.get('天气',{参数:{q:城市}});返回响应数据;}}我们正在创建一个包装HTTP客户端以进行实际API调用的类。需要注意的一件事是类装饰器@Component(),框架将通过它知道这是我们要向DiC注册的组件。它有一个异步方法——它会返回一个Promise——返回给控制器的方法将由Nest处理。HTTP通信层接下来我们需要构建的是控制器。在src/文件夹中创建一个名为weather.controller.ts的文件:import{Get,Controller}from'@nestjs/common';从'./weather.service'导入{WeatherService};@Controller('weather')exportclassWeatherController{constructor(privatereadonlyweatherService:WeatherService){}@Get()asyncroot():Promise
