errorHandler.js 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.QuotaExceededError = exports.BadRequestError = exports.NotFoundError = exports.ForbiddenError = exports.UnauthorizedError = exports.AppError = void 0;
  4. exports.errorHandler = errorHandler;
  5. async function errorHandler(ctx, next) {
  6. try {
  7. await next();
  8. }
  9. catch (err) {
  10. const error = err;
  11. console.error('❌ Error:', error.message);
  12. console.error('Stack:', error.stack);
  13. ctx.status = error.status || 500;
  14. ctx.body = {
  15. code: error.code || 500,
  16. message: error.message || '服务器内部错误',
  17. data: null,
  18. };
  19. // 开发环境返回详细错误
  20. if (process.env.NODE_ENV === 'development') {
  21. ctx.body.stack = error.stack;
  22. }
  23. }
  24. }
  25. // 自定义错误类
  26. class AppError extends Error {
  27. code;
  28. status;
  29. constructor(message, code = 500, status = 500) {
  30. super(message);
  31. this.code = code;
  32. this.status = status;
  33. this.name = 'AppError';
  34. }
  35. }
  36. exports.AppError = AppError;
  37. class UnauthorizedError extends AppError {
  38. constructor(message = '未授权访问') {
  39. super(message, 401, 401);
  40. }
  41. }
  42. exports.UnauthorizedError = UnauthorizedError;
  43. class ForbiddenError extends AppError {
  44. constructor(message = '禁止访问') {
  45. super(message, 403, 403);
  46. }
  47. }
  48. exports.ForbiddenError = ForbiddenError;
  49. class NotFoundError extends AppError {
  50. constructor(message = '资源不存在') {
  51. super(message, 404, 404);
  52. }
  53. }
  54. exports.NotFoundError = NotFoundError;
  55. class BadRequestError extends AppError {
  56. constructor(message = '请求参数错误') {
  57. super(message, 400, 400);
  58. }
  59. }
  60. exports.BadRequestError = BadRequestError;
  61. class QuotaExceededError extends AppError {
  62. constructor(message = '使用次数已达上限') {
  63. super(message, 429, 429);
  64. }
  65. }
  66. exports.QuotaExceededError = QuotaExceededError;