koa之如何優雅的進行錯誤捕捉和返回

在進行網站後端代碼編寫時總是會有一種情況發生,那就是錯誤獲取和返回,誰都不能保證自己寫的代碼一定是正確的,或者在調用數據庫獲取數據、讀取redis時總會有一些不可預料的情況發生,當發生這些情況時,總不能放任不管,否則程序就會掛掉了。

下面是我在使用KOA框架時結合前人經驗,所寫的錯誤捕捉代碼,不足之處請大神指正。

const Koa = require('koa2');
const router = require('koa-router')();
const app = new Koa();

/**
 * 錯誤捕捉中間件
 */
app.use(async(ctx, next) => {
  try {
    ctx.error = (code, message) => {
      if (typeof code === 'string') {
        message = code;
        code = 500;
      }
      ctx.throw(code || 500, message || '服務器錯誤');
    };
    await next();
  } catch (e) {
    let status = e.status || 500;
    let message = e.message || '服務器錯誤';
    ctx.response.body = { status, message };

  }
});
app.use(require('koa-bodyparser')());
app.listen(3000);
console.log('start at port 3000...');

這段代碼啓動了koa,並有一箇中間件來專門處理koa錯誤。在中間件裏,我是給ctx對象添加了一個error方法,接收錯誤編號和錯誤內容,也可以不寫錯誤編號,默認500,當執行ctx.error方法時,就會拋出一個異常,這樣,在其他的路由或中間件裏,代碼執行到ctx.error時就會直接跳回到我的錯誤捕捉中間件,ctx.error後面的代碼就不會再執行了。


使用方法也很簡單。

router.get('/',async(ctx)=>{
    
    
    if(!ctx.request.query.project){
        ctx.error('Project not found!');
        //ctx.error(12345,'Project not found!') 這樣也可以,明確指出當錯誤編碼爲12345時代表project字段未找到
    }
    ....
    //邏輯處理
    ....
    ctx.response.body = res;
});

就是直接調用ctx.error方法。當調用這個方法後,if後面的邏輯處理就不會再執行了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章