在進行網站後端代碼編寫時總是會有一種情況發生,那就是錯誤獲取和返回,誰都不能保證自己寫的代碼一定是正確的,或者在調用數據庫獲取數據、讀取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後面的邏輯處理就不會再執行了。