errorHandler.js 3.2 KB

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