1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
|
import type { Context } from "hono";
import { HTTPException } from "hono/http-exception";
import type { ContentfulStatusCode } from "hono/utils/http-status";
/**
* Application-specific error with status code and optional details
*/
export class AppError extends Error {
readonly statusCode: ContentfulStatusCode;
readonly code: string;
constructor(
message: string,
statusCode: ContentfulStatusCode = 500,
code = "INTERNAL_ERROR",
) {
super(message);
this.name = "AppError";
this.statusCode = statusCode;
this.code = code;
}
}
/**
* Common error factory functions
*/
export const Errors = {
badRequest: (message = "Bad request", code = "BAD_REQUEST") =>
new AppError(message, 400, code),
unauthorized: (message = "Unauthorized", code = "UNAUTHORIZED") =>
new AppError(message, 401, code),
forbidden: (message = "Forbidden", code = "FORBIDDEN") =>
new AppError(message, 403, code),
notFound: (message = "Not found", code = "NOT_FOUND") =>
new AppError(message, 404, code),
conflict: (message = "Conflict", code = "CONFLICT") =>
new AppError(message, 409, code),
validationError: (message = "Validation failed", code = "VALIDATION_ERROR") =>
new AppError(message, 422, code),
internal: (message = "Internal server error", code = "INTERNAL_ERROR") =>
new AppError(message, 500, code),
};
interface ErrorResponse {
error: {
message: string;
code: string;
};
}
/**
* Global error handler middleware for Hono
*/
export function errorHandler(err: Error, c: Context): Response {
// Handle AppError
if (err instanceof AppError) {
const response: ErrorResponse = {
error: {
message: err.message,
code: err.code,
},
};
return c.json(response, err.statusCode);
}
// Handle Hono's HTTPException
if (err instanceof HTTPException) {
const response: ErrorResponse = {
error: {
message: err.message,
code: "HTTP_ERROR",
},
};
return c.json(response, err.status as ContentfulStatusCode);
}
// Handle unknown errors
console.error("Unhandled error:", err);
const response: ErrorResponse = {
error: {
message:
process.env.NODE_ENV === "production"
? "Internal server error"
: err.message,
code: "INTERNAL_ERROR",
},
};
return c.json(response, 500);
}
|