jackieli123723 / jackieli123723.github.io

✅lilidong 个人博客
9 stars 0 forks source link

koa2处理统一处理页面 和api接口4xx,5xx错误 #79

Open jackieli123723 opened 4 years ago

jackieli123723 commented 4 years ago

koa2处理统一处理页面 和api接口4xx,5xx错误

koa2处理统一处理404页面

核心是 ctx.response.redirect("/404")重定向到页面模板引擎

app.use(async (ctx, next) => {
  await next();
  if(parseInt(ctx.status) === 404 ){
    ctx.response.redirect("/404")
  }
})

koa2处理统一处理404 api接口 统一抛出json格式给调用端

核心是把不存在的路由或者访问存在路由的状态码 用try ... catch捕获 然后ctx.app.emit()手动释放error事件,才能让app.on('error')监听函数监听到错误并输出到控制台

global.errorHandlerCodeStatus = {
  OK : 200,
  BadRequest : 400,
  Unauthorized : 401,
  Forbidden : 403,
  NotFound : 404,
  RequestTimeout : 408,
  Gone : 410,
  UnprocessableEntity : 422,
  InternalServerError : 500,
  NotImplemented : 501,
  BadGateway : 502,
  ServiceUnavailable : 503
};

process.on('unhandledRejection', (reason, p) => {
  console.log("Unhandled Rejection at: Promise ", p, " reason: ", reason);
});

process.on("uncaughtException", function (e) {
  console.log(e);
});

//需求 把不存在的路由 也返回json
const handler = async (ctx, next) => {
  try {
    await next();
  } catch (err) {
    ctx.response.status = err.statusCode || err.status || 500;
    ctx.response.body = {
      message: err.message
    };
    ctx.app.emit('error', err, ctx) //try catch 捕获了 使用ctx.app.emit()手动释放error事件,才能让监听函数监听到
  }
};

// 错误捕获 4xx or 5xx status codes 
const errorHandler = async (ctx, next) => {
  await next();
  //way1 
  const originStatus = ctx.status
  const errorCodeList = Object.values(global.errorHandlerCodeStatus)
  let code = errorCodeList.filter((item) => {
    return item === parseInt(originStatus)
  })
  //这里要排除正常请求 200
  if(originStatus!==200 && code){
    ctx.throw(code[0])
  }
  //way2
  // if(parseInt(ctx.status) === 404 ){
  //   ctx.throw(404)
  // }
  // if(parseInt(ctx.status) === 500 ){
  //   ctx.throw(500)
  // }
}

const main = ctx => {
  ctx.throw(502);
};

app.use(handler);
// app.use(main) //模拟抛出4xx or 5xx status codes 
app.use(errorHandler);

//错误日志输出
app.on('error', (err, ctx) => {
  console.error('server error', err.message);
});