NestJS 是一个精心制做的服务器端(后端)应用程序框架,以支持开发人员的生产力并让他们的生活更加快乐。node
那么,它不只是一个框架,它仍是进入领域驱动设计,事件采购,微服务架构等先进工程概念领域的推进者。 全部软件包都以简单轻量级的形式打包,以便您能够选择 - 不管您决定使用整个框架仍是仅从新使用其组件。ios
我是一个 PHP 编写的 Symfony 框架的粉丝。 在个人职业生涯中,我花了好几年的时间开发大型应用程序,它并无让我失望。 它写得很好,做为一个客观的,具备良好文档的模块化 Web 框架,提供了良好的开发者体验。 与我描述 NestJS 彻底同样。git
Node.js 和包管理器 NPM 提供了功能全面的服务器端环境,灵活性强,运行速度极快,对开发人员来讲具备巨大的灵活性,从而将开发到生产的时间缩短到几小时,而不是几天。github
然而,尽管 Node.js 的优势不少,但它并不能解决最多见的问题,在我看来,这是最大的问题,全部的 NodeJS 现代框架彷佛都没有受到熏陶 - 架构的灵活性。typescript
有人可能会说 - 这不是决定项目架构的框架问题。 那么,我彻底赞成这一点,可是咱们几乎在每一个项目中都会看到一些众所周知的概念和模式。 在我看来,若是一个框架将开发人员推向了良好的架构决策,这是一件好事。npm
根据该项目的网站:axios
NEST 是构建高效,可扩展的 NodeJS 服务器端应用程序的框架。
这与 Node.js 语言相同,因此区别在哪里? 那么,重点是在细节:后端
它使用现代JavaScript,使用Typescript(保留与纯 JavaScript 的兼容性)构建,并结合了OOP,FP 和 FRP 的元素。
就是这样。 Nest 框架以一种很是活跃的方式鼓励开发人员尝试,学习和使用一些著名的软件工程范例。这不只是介绍性的口号 - 在项目文档中咱们找到了不少示例,指导和代码源,以便咱们能够在几分钟内在项目中使用它们。
此外,全部这些新词汇的 NestJS 给咱们参考它背后的知识。 因此若是你不知道一些模式 - 不用担忧,你将会顺利地完成整个过程。api
NestJS 是一个彻底用 TypeScript 编写的框架(它也支持 JS),它很容易测试,而且带来了全部必要的东西,你老是但您不知道该选什么。promise
在这篇文章中,咱们将使用 Nest 框架和 OpenWeatherMap API 编写一个简单的天气应用程序。
准备项目
首先,让咱们确保你已经安装了支持的 Node.js 版本:
node -v
须要高于 6.11.0 。 若是您没有安装Node.js或版本不正确,请安装或更新。
第二步是从 OpenWeatherMap 网站检索API密钥。 为了实现咱们须要注册的功能,成功注册后,咱们将可以从 API密钥标签中检索咱们的API密钥 。
准备就绪了。 让咱们来设置这个项目。 为此,我将使用 Nest 的 TypeScript 初学者存储库(还有一种方法能够从头开始构建项目,但我很懒)。 它提供了良好的初学者体验,并拥有开始编写代码所需的一切。
$ git clone https://github.com/nestjs/typescript-starter.git project $ cd weather-app /
安装依赖关系并启动:
$ npm i $ npm run start
当安装了项目依赖关系而且应用程序成功启动后,您应该在控制台中看到如下输出,并在浏览器中指向 http://localhost:3000/ 的url,应该会给您热情而欢迎的Hello World! 文本。
> nest-typescript-starter@1.0.0 start /Users/mat/Development/weather-app> node index.js [Nest] 31827 - 2018-1-13 11:39:32 [NestFactory] Starting Nest application... [Nest] 31827 - 2018-1-13 11:39:32 [InstanceLoader] ApplicationModule dependencies initialized +7ms [Nest] 31827 - 2018-1-13 11:39:32 [RoutesResolver] AppController {/}: +34ms [Nest] 31827 - 2018-1-13 11:39:32 [RouterExplorer] Mapped {/, GET} route +2ms [Nest] 31827 - 2018-1-13 11:39:32 [NestApplication] Nest application successfully started +1ms
咱们已经创建了项目,获取天气数据的 API密钥和开发服务器,随时准备交付。
咱们如今安装一个HTTP客户端,在这个区域个人我的偏好是 axios 。 为何选择axios? 这是一个基于Promise 的客户端,它支持服务器端和客户端,并提供许多有用的功能,如:对JSON转换的自动响应和专用的工具 - moxios--使测试变得顺畅和轻松。
$ npm i --save axios
如今咱们能够开始构建咱们的第一个服务
为了作到这一点,让咱们在咱们的 src/ 文件夹中建立一个名为 weather.service.t s的文件:
import { Component } from '@nestjs/common'; import axios, { AxiosInstance } from 'axios'; @Component() export class WeatherService { private client: AxiosInstance; constructor() { this.client = axios.create({ baseURL: 'https://api.openweathermap.org/data/2.5/', params: { APPID: 'CHANGE_ME' } }); } async ofCity(city: string): object { const response = await this.client.get('weather', { params: { q: city } }); return response.data; } }
咱们正在建立一个封装 HTTP 客户端的类,以实现实际的 API 调用。 有一点须要注意的是类装饰器 @Component(),多亏了它,框架才会知道这是咱们想要在 DiC 中注册的组件。 它有一种方法,这是异步的 - 它会返回一个Promise - 返回到控制器将由 Nest 处理。
HTTP通讯层
接下来咱们须要创建的是控制器。 在src /文件夹中建立一个名为 weather.controller.ts 的文件:
import { Get, Controller } from '@nestjs/common'; import { WeatherService } from './weather.service'; @Controller('weather') export class WeatherController { constructor(private readonly weatherService: WeatherService) {} @Get() async root(): Promise< object > { const response = await this.weatherService.forCity('New York'); return response; }
装饰器 @Controller('weather')告诉框架咱们指望这个控制器在 / weather 路由上做出响应。
而后,咱们在类构造函数中注入了咱们的 WeatherService ,并将其设置为名为weatherService 的私有属性。
最后是一个称为 root 的异步操做,它返回一个Promise,最终解析为一个对象。 它内部调用咱们的 weatherService 并得到纽约的实际天气预报。
链接点
为了使咱们的应用程序正常工做,咱们须要作的最后一件事是将应用程序模块中的全部部分链接在一块儿:
import { Module } from '@nestjs/common'; import { AppController } from './app.controller'; import { WeatherController } from './weather.controller'; import { WeatherService } from './weather.service'; @Module({ imports: [], controllers: [AppController, WeatherController], components: [WeatherService], })export class ApplicationModule {}
保存文件,重启你的开发服务器,当你在浏览器中导航到url http://127.0.0.1:3000/weather 时,你会看到天气服务的响应。
上面的代码是为了显示咱们如何快速地在 NestJS 中构建一个好的东西。然而, 我看到一些改进, 这尚未作, 由于我想保持简单:
咱们从理论上讨论了NestJS并作了一个实际的例子。 欲了解更多信息,请参阅框架的官方文档,其中包含大量随时可用的指导和代码片断。
Node.js 是为了扩展和实现实时网络应用程序的高效开发而建立的,它很是好。
如今咱们已经有了 NestJS 框架来解决架构问题。
中文文档: https://docs.nestjs.cn
英文官方文档:https://docs.nestjs.com