errorHandler.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. "use strict";
  2. const common_vendor = require("../common/vendor.js");
  3. const ERROR_CODE_MAP = {
  4. 400: "请求参数错误",
  5. 401: "登录已过期,请重新登录",
  6. 403: "没有权限执行此操作",
  7. 404: "请求的资源不存在",
  8. 500: "服务器错误,请稍后重试",
  9. 502: "网关错误",
  10. 503: "服务不可用,请稍后重试",
  11. 504: "网关超时"
  12. };
  13. const BUSINESS_ERROR_CODE_MAP = {
  14. 10001: "用户名或密码错误",
  15. 10002: "账号已被禁用",
  16. 10003: "验证码错误",
  17. 10004: "操作过于频繁,请稍后再试"
  18. // 添加更多业务错误码...
  19. };
  20. class ErrorHandler {
  21. constructor() {
  22. this.lastMessage = "";
  23. this.lastTime = 0;
  24. }
  25. /**
  26. * 显示错误提示
  27. * @param {string} message - 错误信息
  28. * @param {number} duration - 显示时长
  29. */
  30. showError(message, duration = 2e3) {
  31. if (this.lastMessage === message && Date.now() - this.lastTime < 3e3) {
  32. return;
  33. }
  34. common_vendor.index.showToast({
  35. title: message,
  36. icon: "none",
  37. duration
  38. });
  39. this.lastMessage = message;
  40. this.lastTime = Date.now();
  41. }
  42. /**
  43. * 处理HTTP错误
  44. * @param {number} statusCode - HTTP状态码
  45. * @param {Object} response - 响应对象
  46. * @returns {Error} - 格式化的错误对象
  47. */
  48. handleHttpError(statusCode, response) {
  49. const errorMsg = ERROR_CODE_MAP[statusCode] || `网络请求错误:${statusCode}`;
  50. this.showError(errorMsg);
  51. const error = new Error(errorMsg);
  52. error.code = statusCode;
  53. error.response = response;
  54. if (statusCode === 401) {
  55. this.handleUnauthorized();
  56. }
  57. return error;
  58. }
  59. /**
  60. * 处理业务错误
  61. * @param {Object} data - 业务响应数据
  62. * @returns {Error} - 格式化的错误对象
  63. */
  64. handleBusinessError(data) {
  65. const errorMsg = BUSINESS_ERROR_CODE_MAP[data.code] || data.msg || "请求失败";
  66. this.showError(errorMsg);
  67. const error = new Error(errorMsg);
  68. error.code = data.code;
  69. error.data = data;
  70. return error;
  71. }
  72. /**
  73. * 处理网络请求失败
  74. * @param {Object} err - 原始错误对象
  75. * @returns {Error} - 格式化的错误对象
  76. */
  77. handleRequestFail(err) {
  78. let errorMsg = "网络请求失败,请检查网络连接";
  79. if (err.errMsg) {
  80. if (err.errMsg.includes("timeout")) {
  81. errorMsg = "请求超时,请检查网络连接";
  82. } else if (err.errMsg.includes("abort")) {
  83. errorMsg = "请求已取消";
  84. } else if (err.errMsg.includes("SSL")) {
  85. errorMsg = "网络安全证书错误";
  86. }
  87. }
  88. this.showError(errorMsg);
  89. const error = new Error(errorMsg);
  90. error.original = err;
  91. return error;
  92. }
  93. /**
  94. * 处理未授权错误(401)
  95. */
  96. handleUnauthorized() {
  97. common_vendor.index.removeStorageSync("token");
  98. common_vendor.index.removeStorageSync("userInfo");
  99. setTimeout(() => {
  100. common_vendor.index.navigateTo({
  101. url: "/pages/login/login"
  102. });
  103. }, 1500);
  104. }
  105. /**
  106. * 记录错误日志
  107. * @param {Error} error - 错误对象
  108. * @param {string} source - 错误来源
  109. */
  110. logError(error, source = "unknown") {
  111. console.error(`[${source}] Error:`, error);
  112. }
  113. }
  114. const errorHandler = new ErrorHandler();
  115. exports.errorHandler = errorHandler;