日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

koa --- 使用中间件多层级抛出错误

發(fā)布時間:2023/12/10 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 koa --- 使用中间件多层级抛出错误 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

說明

  • 能夠熟練的掌握錯誤的拋出,可以在一定程度上提高代碼的開發(fā)效率和可讀性

構(gòu)造錯誤

  • 本栗采用調(diào)用一個不存在的函數(shù)來拋出錯誤
const Koa = require('koa'); const app = new Koa();// 響應(yīng)時間輸出中間件 app.use(async (ctx, next) => {await next();// 獲取響應(yīng)頭,印證執(zhí)行順序const rt = ctx.response.get('X-Response-Time');console.log(`輸出倒計時: ${ctx.method} ${ctx.url} - ${rt}`); });// 響應(yīng)時間統(tǒng)計中間件 app.use(async (ctx, next) => {const start = Date.now();console.log('開始計時');await next();const ms = Date.now() - start;ctx.set('X-Response-Time', `${ms}ms`);console.log('結(jié)束計時'); })// 響應(yīng) app.use(async ctx =>{await sleep(250);ctx.status = 200;ctx.type = 'html';ctx.body = `<h1>Hello Koa</h1> })


  • 注: 函數(shù)的執(zhí)行順序:
  • 根據(jù)洋蔥模型: 首先執(zhí)行 const start = Date.now()
  • console.log('開始計時');
  • 遇到await next()跳到下一個中間件,并將await next()后面的代碼入一個函數(shù)調(diào)用棧
  • 執(zhí)行await sleep(250)
  • 由于sleep函數(shù)未定義,于是拋出錯誤
    • 注: 部分api說明:

  • const rt = ctx.response.get('X-Response-Time'): 獲取請求頭部中’X-Response-Time’的值
  • ctx.set('X-Response-Time', '${ms}ms'): 返回頭部’X-Response-Time’添加值
  • koa級別拋出錯誤,并獲取處理錯誤

    • 拋出錯誤不進(jìn)行處理
    • 將該中間件放在倒數(shù)第二個中間件的位置.
    // 錯誤處理 app.use(async (ctx, next) => {try {await next();} catch (error) {ctx.status = error.statusCode || error.status || 500;ctx.body = error.message;// 觸發(fā)應(yīng)用層級的錯誤事件ctx.app.emit('error', error, ctx);console.log("中間件捕捉:", error.message);} })


    • 說明:
  • try{ await next() }: 嘗試運行下一個中間件,如果遇到錯誤則運行catch塊中的代碼
  • ctx.body = error.message: 用戶級別的拋出錯誤,用于再瀏覽器中提醒用戶錯誤的信息
  • ctx.app.emit('error', error, ctx): koa框架應(yīng)用層級的錯誤,錯誤的標(biāo)識為’error’,可以通過app.on('error')來進(jìn)行處理.由于此處沒有app.on('error'),因此會默認(rèn)的執(zhí)行以下語句
  • // 其實不存在 app.on('error', err=>{console.error(err); })
    • 使用app.on('error', err=>{}) 處理
    // 拋出node層級的錯誤, // 向上層拋出錯誤 app.on('error', err=>{throw err; })


    • 注: 后臺直接掛掉.

    總結(jié)

    以上是生活随笔為你收集整理的koa --- 使用中间件多层级抛出错误的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。