在函数调用链的最外层,做一个中间件处理异常
AOP,面向切片编程

httpException.js

  1. async function HttpException(ctx, next) {
  2. try {
  3. await next()
  4. }
  5. catch(e) {
  6. ctx.body = '服务器出现异常,正在维护中'
  7. }
  8. }
  9. module.exports = HttpException;

HttpException

  1. /**
  2. * 全局异常捕获,不需要单独在函数调用链中使用 try catch捕获异常
  3. * 可以监听到 函数调用链上的任何异常,并且把所有的错误逻辑集中处理
  4. * AOP 面向切片编程
  5. * @param ctx 上下文环境
  6. * @param next 下一个中间件函数
  7. * @returns {Promise<void>}
  8. */
  9. const {
  10. HttpException, NotFoundException
  11. } = require('@exception')
  12. const catchError = async (ctx, next) => {
  13. try {
  14. await next() // 没有错误,直接 next
  15. if (ctx.status === 404) {
  16. throw new NotFoundException()
  17. }
  18. }catch(e) {
  19. const isHttpException = e instanceof HttpException
  20. let env = 'dev' // global.config.env === 'dev'
  21. if (env === 'dev' && !isHttpException) {
  22. throw e
  23. }
  24. console.log('error global', e)
  25. // 已知异常 & 未知异常 500
  26. const { message, code, status } = isHttpException ? e : new HttpException()
  27. ctx.body = {
  28. message,
  29. code,
  30. url: `${ctx.method} ${ctx.path}`
  31. }
  32. ctx.status = status
  33. }
  34. }
  35. module.exports = catchError

错误信息挂载到global

  1. global.error = HttpException;
  2. // use
  3. const error = new global.error.ParameterException();