iT邦幫忙

2023 iThome 鐵人賽

DAY 2
0
自我挑戰組

初探後端世界-使用Node.js框架開發網頁系列 第 2

你需要知道的9個元件功能介紹 -1(Controllers)

  • 分享至 

  • xImage
  •  

所有元件一覽

  • Controllers
  • Providers
  • Modules
  • Middleware
  • Exception filters
  • Pipes
  • Guards
  • Interceptors
  • Custom decorators

Controllers

如果一句話來解釋的話,Controllers是負責處理來自client端的request,並根據需求做出相對應的response。

提到根據需求,就必須提到路由機制(routing mechanism)。它負責控制哪個controllers要接受哪個request,所以通常每個controllers底下都會有不只一個route,而不同的route就能提供不同的行為。

重要名詞解釋- Decorator(裝飾器)

要創建一個基本的Controllers,我們會用到classes和decorator,我會把decorator想像成便利貼,用來告訴NestJS這是用來處理什麼請求的,而我們在把不同的便利貼組合進class類別裡來創建routing map。

看到現在或許還是有些陌生,就來創建一個controller看看吧!

https://ithelp.ithome.com.tw/upload/images/20230917/20163253sdAKTEmrFv.png

安裝postman插件(API測試工具)

https://ithelp.ithome.com.tw/upload/images/20230917/20163253M3jlXopdiw.png

設定Global變數

https://ithelp.ithome.com.tw/upload/images/20230917/20163253wrwgRoFblf.png

1. 路由

程式碼修改處:
https://ithelp.ithome.com.tw/upload/images/20230917/20163253WWSRBnn4mS.png

API測試結果如下:
https://ithelp.ithome.com.tw/upload/images/20230917/20163253z59cvL6DZH.png

2. 子路由

在schedule的路由下再添加一個子路由 hotel
方法:在HTTP Method裝飾器中加入子路徑

程式碼修改處:
https://ithelp.ithome.com.tw/upload/images/20230917/20163253dkCZwzWFoy.png

API測試結果如下:
https://ithelp.ithome.com.tw/upload/images/20230917/20163253ZyBkCx33gb.png

3. 路由參數(Path Parameters)

在hotel的路徑下加入參數
方法:import處加入@Param裝飾器,並在HTTP Method裝飾器下給定子路徑「:參數名」

程式碼修改處:
https://ithelp.ithome.com.tw/upload/images/20230917/20163253yCg5r0TMvS.png

API測試結果如下:
https://ithelp.ithome.com.tw/upload/images/20230917/20163253mXvtNFxVrt.png

4. 主體資料(HTTP BODY)

在createSchedule中利用@Body裝飾器來取得物件data

程式碼修改處:
https://ithelp.ithome.com.tw/upload/images/20230917/20163253Pa95hCU3bC.png

API測試結果如下:
https://ithelp.ithome.com.tw/upload/images/20230917/20163253XFxFabzu0U.png

5. 狀態碼(HTTP CODE)

用@HttpCode裝飾器來指定回傳的http code為204

*回傳 204 的常見情況是作為PUT請求的回應,更新一個資源且沒有更動目前顯示給使用者的頁面內容。若是有資源被建立,201 Created 則應該被回傳。而若頁面應該更新為新的頁面,則應使用 200

程式碼修改處:
https://ithelp.ithome.com.tw/upload/images/20230917/20163253qXv6Cypm8a.png

API測試結果如下:
https://ithelp.ithome.com.tw/upload/images/20230917/20163253avSwbdoTcP.png

6. 處理非同步請求(標準狀態下)

  • 用Promise
  • 用async/await
  • RxJS

用Promise

不知道promise是什麼可以參考這個:
https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference/Global_Objects/Promise

程式碼修改處:
https://ithelp.ithome.com.tw/upload/images/20230917/20163253qYjnJsjZfR.png

可以看到成功回傳foo,編譯時間也大約是300ms
API測試結果如下:
https://ithelp.ithome.com.tw/upload/images/20230917/20163253320mJTPJl6.png

用async/await

關於async/await的用法可以參考這個:
https://kamilmysliwiec.com/typescript-2-1-introduction-async-await

程式碼修改處:
https://ithelp.ithome.com.tw/upload/images/20230917/20163253AZefsRBLw6.png

API測試結果如下:
https://ithelp.ithome.com.tw/upload/images/20230917/20163253dCmwvhBEoW.png

用rxjs

*這裡要注意import {of} from 'rxjs'

程式碼修改處:
https://ithelp.ithome.com.tw/upload/images/20230917/20163253Vx53HocaUJ.png

API測試結果如下:
https://ithelp.ithome.com.tw/upload/images/20230917/20163253uUjmGMUIUU.png

Library-specific approach

直接回應物件而非使用return,若真的要使用return,則需要在裝飾器裡添加參數passthrough為true

程式碼修改處:
https://ithelp.ithome.com.tw/upload/images/20230917/20163253KDlD4KcPkh.png

API測試結果如下:
https://ithelp.ithome.com.tw/upload/images/20230917/20163253dvK3AyfxCV.png

hybridfail

程式碼修改處:
https://ithelp.ithome.com.tw/upload/images/20230917/20163253SoDGVKOOFE.png

API測試結果如下:
https://ithelp.ithome.com.tw/upload/images/20230917/20163253tglZ4DICJz.png

hybrid

程式碼修改處:
https://ithelp.ithome.com.tw/upload/images/20230917/2016325307ugk9DnaL.png

API測試結果如下:
https://ithelp.ithome.com.tw/upload/images/20230917/20163253nlwTB0EPfJ.png


後記:第二天花了一整個下午跟晚上在學習並且消化後打出來,但實際上很多地方都感覺心領神會卻不知道要如何解釋出來,但這就是訓練吧!習慣output大於input才能真正學進去.如果要給明天的我一個建議,我會說:先把下個單元的內容大致看過一遍,理解後再用類似樹狀圖的方式區把標題分好,要快一點打好的話,就是先把任務做好截圖就先傳上來,事後再看著自己的圖打開預覽,另外開obsidian把重點筆記對照的打出來,然後複製貼上來.

by 中午信心滿滿地說今天要一次打9天的量,結果連1篇都打不完的查理熊


上一篇
[Day 01] 開始環境建置
下一篇
你需要知道的9個元件功能介紹 -2(Providers)
系列文
初探後端世界-使用Node.js框架開發網頁12
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言