前言
相信大家接著看一定很疑惑為什麼第三天不是前一天講的Auth,沒錯,小編就是這麼不按照牌理出牌!沒有拉,那是考量到講Auth一定會講到Route跟Controller和Context,所以調整了一下順序,不浪費時間我們開始吧。
一切的起始
/.adonisrc.json檔案,很驚訝不是routes.ts吧,別緊張聽我娓娓道來,.adonisrc.json可以把這個檔案視為整個專案的配置檔,這裡面有配置起始必須載入的檔案,因此./start/routes就是在這個地方註冊的,不過/start/routes.ts是初始設定,不用調整,只是提一下讓你知道。至於./start/kernel是什麼東西,日後有機會我們再回來看。
接著來說明一下路由,簡單來說就設定是打api的uri,藉由不同的uri去呼叫不同的function處理不同的邏輯,大概就是這麼回事。
那我們來看一下routes.ts目前有什麼東西吧
return { hello: 'world' }})
大家還記得前天把專案run起來,進入根目錄看到的內容嗎?沒錯就是上面這段{hello: 'world'},因此這裡可以解釋為,由根目錄進入且走GET的會執行上述方法,該方法回傳一個物件。
當然大家也可以依照專案需求,不一定要把所有路由都寫在同一個routes.ts中,可以藉由引入的方式來分類不同的路由
// /start/routes.tsimport '/start/User/routes'
import '/start/Cart/routes'import '/start/Product/routes'
Route有內建一些實用的方法,以下小編會依照常用的一一做介紹
Methods
那既然有GET那必然也有POST, PATCH, PUT, DELETE甚至是any或多個methods
Route.post('posts', async () => {})Route.any('report', async () => {})Route.route('/', ['POST', 'GET'], async () => {})
Prefix
prefix就是把網址加上前綴,讓同類別功能的api更有一至性
Middleware
這觀念過兩天會有更詳細的解釋跟範例,邊簡單跟大家可以簡單理解為進入方法前的前置作業及後置作業。
Namespace
一般我們不會真的把邏輯全部寫在routes.ts裡面,這樣檔案會過於龐大且混亂,通常我們會make一個新的controller,再藉由route的第二個參數,可以指定controller的method,例如
Route.get('/api/users', 'UsersController.getList')
這意思就是指,只要符合路由,就會呼叫UsersController底下的getList方法
然而controller預設的路徑是在/App/Controllers/http底下,如果因為專案規劃希望是不同的路徑,就需要在route增加namespace告訴系統檔案在什麼地方。
Group
Group的參數為一個匿名函數,可以理解為在函數中的所有route都附加該group的效果
Route.group(() => {
Route.get('/users', 'UsersController.index')
Route.get('/posts', 'PostsController.index')
}).prefix('/api')
這樣就會宣告兩個同時擁有/api前綴的接口:GET /api/users, GET /api/posts
Params
有時會會把primary key或是參數放在網址裡面,當然這參數也可以是選填,甚至可以限制輸入的條件(where),一旦符合才會進入route
// 需填入id才會符合路由Route.get('/posts/:id', async ({ params }) => {
return `${params.id}`
})
// id為選填Route.get('/posts/:id?', async ({ params }) => {
if (params.id) {
return `${params.id}`
}
return 'Viewing all posts'
})
// id須為數字組成才符合路由Route .get('/posts/:id', async ({ params }) => { return `${params.id}` }) .where('id', /^[0-9]+$/)
// 也可以全域限制id的類型,且不受group限制Route.where('id', /^[0-9]+$/)
後記
AdonisJs5開始支援typescript,很多api其實不用像以前弱型別時需要特別去記它,只要 . 下去,大部分聰明的ide就會列出可以使用的api提供選擇可以說非常方便。其實我寫出來的內容並非完整的,如果需要完整的資訊,其實官網的文件寫得我覺得算很友善了,只要你不排斥看英文,這些網誌我只是希望分享我的開發經驗與心得,分享自己較常用到的功能、基礎知識及做個紀錄。
沒有留言:
張貼留言