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