koa簡單使用

一. RESTful(Representational State Transfer)風格API:

1. 客服服務端(Client-Server)

關注點分離红柱,服務端專注數(shù)據(jù)存儲,提升了簡單性释簿,前端專注用戶界面,提升了可移植性

2. 無狀態(tài)(Stateless)

每次請求必須包括所有信息柬祠,不能依賴上下文信息巨缘,客戶端保留所有會話信息欣鳖,服務端不再保留會話信息

3. 緩存(Cache)

所有信息必須標記為可緩存或不可緩存

4. 統(tǒng)一接口(Uniform Interface)

接口設計盡可能統(tǒng)一,接口與實現(xiàn)解耦

5. 分層系統(tǒng)(Layered System)

每一層只知道相鄰的一層不傅,每一層負責不同的功能安全旅掂,負載均衡

6. 按需代碼

RESTful風格最佳例子:https://developer.github.com/v3/

二.koa基礎使用

1.自定義路由

koa所需工具:nodemon自動重啟
記得取package.json里寫腳本:"start":"nodemon index.js",
斷點調試和查看官網(wǎng)的api:ctx.url ctx.status ctx.method ctx.body

const Koa = require("koa")
const app = new Koa()

app.use(async (ctx) => {
    if (ctx.url === '/') {
        //處理不同的url
        ctx.body = "這是主頁 "
    } else if (ctx.url === "/user") {
        //處理不同的方法
        if (ctx.method === "GET") {
            ctx.body = "這是用戶列表頁"
        } else if (ctx.method === "POST") {
            ctx.body = "創(chuàng)建用戶"
        } else {
            //方法不允許
            ctx.status = 405
        }

    } else if (ctx.url.match(/\/user\/\w+/)) {
        // 解析請求參數(shù)
        const userId = ctx.url.match(/\/user\/(\w+)/)[1]
        ctx.body = `這是用戶${userId}`
    } else {
        ctx.status = 404
    }
})
app.listen(3000)
2.使用koa-router,不用自定義路由

koa-router實現(xiàn)路由

獲取HTTP請求參數(shù):

  1. 獲取query(ctx.query). ?q=keyword
  2. 獲取body(koa-bodyparser||koa-body)
  3. 獲取header(ctx.header). Accept,Cookie
  4. 獲取router params(ctx.params). /users/:id

發(fā)送HTTP響應:

  1. 發(fā)送status(ctx.status)
  2. 發(fā)送body(ctx.body)
  3. 發(fā)送header(ctx.set("Allow","get","post"))Allow Content-type
  4. 實現(xiàn)用戶的增刪改查(get獲取用戶访娶,post新建返回新建用戶商虐,put全部更新,patch局部更新崖疤,delete刪除返回204秘车,options顯示支持什么訪問方法)
    常用狀態(tài)碼:
    204:刪除用戶后返回,表示成功狀態(tài)響應代碼指示請求已成功戳晌,但沒有內容返回
    200:響應成功鲫尊,內容返回
    500:運行時錯誤
    404:找不到
    412:先決條件失敗
    422:無法處理的實體,參數(shù)格式不對
const Koa = require("koa")
const Router = require("koa-router")
const app = new Koa()
const router = new Router()
//前綴
const userRouter = new Router({ prefix: "/user" })
const koaBody = require("koa-body")
const parser = require("koa-bodyparser")
//多中間件  
const auth = async (ctx, next) => {
    // if(ctx.url !== "/user"){
    //     //沒有權限  
    //     ctx.throw(401)
    // }
    await next( )
}

router.get("/", (ctx) => {
    ctx.body = "這是主頁"
})
//處理不同的url
userRouter.get('/', auth, (ctx) => {
    ctx.body = "這是用戶列表"
})
//處理不同的方法 post新建用戶 返回新建的用戶
userRouter.post("/", auth, (ctx) => {
    ctx.body = "創(chuàng)建用戶"
})
//解析請求參數(shù) get查列表 返回列表
userRouter.get("/:id", auth, (ctx) => {
    //設置header響應頭
    ctx.set("Allow","GET,POST")
    ctx.body = `這是用戶${ctx.params.id}列表 `
})
//put修改 返回修改的用戶
userRouter.put("/:id", (ctx) => {
    ctx.body = `這是用戶${ctx.params.id}`
})
//delete刪除 返回實體沦偎,但是成功
userRouter.delete("/:id", (ctx) => {
    ctx.status = 204
})

//注冊中間件
app.use(parser( ))
app.use(router.routes())
app.use(userRouter.routes())
//響應options方法請求疫向,告訴他所支持的請求方法
//405方法不允許咳蔚,支持但沒寫。501方法無法實現(xiàn)搔驼,不存在 
app.use(userRouter.allowedMethods())

app.listen(3000)
//http請求參數(shù):
//Query String  如谈火?q=keyword(可選)
//Router Params 如/user/:id(必傳)
//Body,如json,form等conten-type里面會寫到
//Header,如accept舌涨,cookie糯耍,jwt等
  
//發(fā)送http響應:
//發(fā)送status。如200/400等
//發(fā)送body囊嘉,如json等
//發(fā)送header温技,如allow,content-type等 
//1.每個資源的控制器盡量發(fā)在不同的文件里
//2.盡量使用類+類的形式編寫控制器
//3.嚴謹?shù)腻e誤處理
3.錯誤處理和更加合理的目錄結構

錯誤處理:
ctx.throw(422,'文本信息')
koa-json-error:記得隱藏堆棧信息扭粱,在生產環(huán)境的時候
koa-parameter:校驗參數(shù)ctx.verifyParams({name:{type:"string",required:true}})

const Koa = require("koa")
const bodyParser = require("koa-bodyparser")
const app = new Koa()
const routing = require("./routes")
const error = require("koa-json-error")
const parameter = require('koa-parameter')//校驗參數(shù)

//自定義的錯誤處理舵鳞,無法捕獲404信息
// app.use(async (ctx, next) => {
//     try {
//         await next()
//     } catch (error) {
//         //斷點
//         ctx.status = error.status || error.statusCode || 500
//         //返回json格式
//         ctx.body = {
//             message: error.message
//         }
//     }
// })
app.use(error({
    //定制返回格式
    postFormat: (e, { stack, ...rest }) => {//原生的error,應該返回的格式
        // "start": "export NODE_ENV='production'&& nodemon app",
        return process.env.NODE_ENV === "production" ? rest : { stack, ...rest }
    }
}))//koa-json-error中間價處理錯誤琢蛤,404蜓堕,412,500
app.use(bodyParser())//解析請求體
app.use(parameter(app))//校驗參數(shù)博其,傳入app套才,進行全局的使用,全局方法慕淡,比如在create方法中
routing(app)
app.listen(3000, () => { console.log("程序在3000端口啟動了") })
//異常狀況有哪些
//1.運行是錯誤背伴,服務器內部的錯誤500
//2.邏輯錯誤,找不到404峰髓,先決條件失敗412挂据,無法處理的實體(參數(shù)格式不對422)
// 為什么要使用錯誤處理
//1.防止程序掛掉
//2.告訴用戶信息
//3.便于開發(fā)者調試
目錄結構
4.鏈接數(shù)據(jù)庫的操作

到這里為止的倉庫地址:https://github.com/ranzhouhang/2020-9-12practice

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市儿普,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌掷倔,老刑警劉巖眉孩,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異勒葱,居然都是意外死亡浪汪,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門凛虽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來死遭,“玉大人,你說我怎么就攤上這事凯旋⊙教叮” “怎么了钉迷?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長钠署。 經(jīng)常有香客問我糠聪,道長,這世上最難降的妖魔是什么谐鼎? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任舰蟆,我火速辦了婚禮,結果婚禮上狸棍,老公的妹妹穿的比我還像新娘身害。我一直安慰自己,他們只是感情好草戈,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布塌鸯。 她就那樣靜靜地躺著,像睡著了一般猾瘸。 火紅的嫁衣襯著肌膚如雪界赔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天牵触,我揣著相機與錄音淮悼,去河邊找鬼。 笑死揽思,一個胖子當著我的面吹牛袜腥,可吹牛的內容都是我干的。 我是一名探鬼主播钉汗,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼羹令,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了损痰?” 一聲冷哼從身側響起福侈,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎卢未,沒想到半個月后肪凛,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡辽社,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年伟墙,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片滴铅。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡戳葵,死狀恐怖,靈堂內的尸體忽然破棺而出汉匙,到底是詐尸還是另有隱情拱烁,我是刑警寧澤生蚁,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站邻梆,受9級特大地震影響,放射性物質發(fā)生泄漏浦妄。R本人自食惡果不足惜尼摹,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一剂娄、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧阅懦,春花似錦和二、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽怕午。三九已至废登,卻和暖如春郁惜,著一層夾襖步出監(jiān)牢的瞬間堡距,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工兆蕉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留羽戒,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓易稠,卻偏偏與公主長得像,于是被迫代替她去往敵國和親缩多。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內容