koa2 全局捕獲錯誤

目前在用koa2寫一個簡單的小網站,用了一個orm框架sequelize來操做mysql,sequelize是用promise封裝的,可是碰到個問題,當操做錯誤時(例如在用戶表插入重複用戶),走了promise的reject(也就是then catch裏的catch),會直接給頁面返回500 Internal Server Error,一開始覺得是sequelize的問題,後來發現不是,是koa2本身對於promise的reject的處理。前端

個人需求呢,是不往前端傳500和報Internal Server Error,而是傳200而且把那個sequelize返回的錯誤對象直接給前端,探索了很久,找到這麼一個方法,全局捕獲錯誤,而後本身定義http狀態碼(ctx.status ctx.response.status)和返回的body(ctx.response.body 也能夠寫成 ctx.body),並且比較重要的一點,這個全局代碼要寫在路由前面,由於錯是從路由控制models控制utils來的,你放在路由後就沒法捕獲了。mysql

全局捕獲代碼以下sql

 1 app.use(async (ctx, next) => {
 2   try {
 3     await next();
 4   } catch (err) {
 5     ctx.app.emit('error', err, ctx);
 6   }
 7 });
 8 
 9 app.on('error', (err, ctx) => {
10   ctx.status = 200;
11   ctx.body = err;
12 });
相關文章
相關標籤/搜索