Router
在上一篇中提到了 Middleware
今天會討論到更多細節的部分
但是第一步要先了解關於 Router
Express 可以拿來寫 RESTful API
但是 route
要如何分類呢?
雖然之前已經有用 app.get
來做基本的 route
但是如果大量使用的話其實會造成程式碼的雜亂跟難以維護
所以 Express 中有一個 Router
的 funciton
可以產出一個 Router 物件
然後再藉由 app.use
來做 route 的實現和管理
基本上可以這樣分類
分類方式沒有絕對答案
routes/userRoutes.js
1 | const express = require('express'); |
app.js
1 | const express = require('express'); |
這時候如果我們用 POST
呼叫 http://localhost:5000/user
得到的 respnose 會是 {"name": "tomas"}
我想這部分應該沒什麼問題
然後我們按照之前的模式把這些程式碼改為 .re
routes/UserRoutes.re
1 | type response = {. "name": string }; |
1 | type res = {. |
首先遇到幾個問題
- 一個是如何
require
正確的routes/UserRoutes.bs
中的routes
?- 延伸怎麼控制 export ? 只能用 Reason 預設的?
- app.use 有兩種 input 格式 如何處理?
1 | [@bs.module "./routes/UserRoutes.bs"] external userRoutes: router = "routes"; |
第一個問題基本上上述那一行就可以解決
Import And Export
之前有提過如何引用共用模組
今天來談談本地的模組引用問題
在 Reason
中如何控制 export
呢?
BuckleScript 支援
- CommonJS (require(‘MyFile’))
- ES6 modules (import myFile from ‘MyFile’)
- AMD(define([‘myFile’], …)
預設的 let
綁定的值都會自動 export
所以其他檔案都可以使用
Export ES6 value
example:
student.js
1 | export default name = "Al"; |
teacher.js
1 | import studentName from 'student.js'; |
在 Reason 中只需要用 let
綁定 default 這個變數
就可以自動輸出 ES6 預設模組
FavoriteStudent.ml
1 | let default = "default value"; |
demo.js
1 | import studentName from 'FavoriteStudent.js'; |
Import
使用 @bs.module
1 | [@bs.module "path"] external dirname : string => string = "dirname"; |
output
1 | var Path = require("path"); |
Import Default value
1 | [@bs.module] external leftPad : string => int => string = "./leftPad"; |
output
1 | var LeftPad = require("./leftPad"); |
Import an ES6 Default value
1 | [@bs.module "./student"] external studentName : string = "default"; |
1 | const Student = require("./student"); |
當你在 BuckleScript 端使用的名稱和 JS 名稱相匹配
你可以使用空字串
1 | [@bs.module "path"] external dirname : string => string = ""; |
相同的 Function 不同的參數
我們可以看到 app.use
和 router.use
中有兩種不同的輸入值
1 | app.use((req, res, next) => { |
如上例可以看到 相同的 app.use
卻有兩種不同的輸入值得型態
在強形態中不能將這種 視為同樣的一個 function
所以要將它分為兩種 function 型態
1 | type handler = (string, res, nextFun) => string; |
可以看到 use
的 參數是放入一個 handler
的類型
而另一個 useWithString
也是 app.use
但是參數的類型是另外的 (string, router) => unit
第一個參數是字串 第二個是 router
的類型
裡面有一個 get
和 use
的 method
當然若是要實現 RESTful API
要再增加 post
, put
, delete
….
不過方式也都一樣
也就不贅述了