|
3 | 3 | _ResponseMiddleware, |
4 | 4 | createApp, |
5 | 5 | createEvent, |
| 6 | + EventHandler, |
6 | 7 | eventHandler, |
| 8 | + EventHandlerObject, |
7 | 9 | getHeader, |
8 | 10 | H3Event, |
9 | 11 | sendWebResponse |
@@ -52,109 +54,85 @@ export function nitroPlugin( |
52 | 54 | return async () => { |
53 | 55 | removeHtmlMiddlewares(viteDevServer); |
54 | 56 |
|
55 | | - const h3App = createApp(); |
56 | | - |
57 | 57 | const serverEnv = viteDevServer.environments.server; |
58 | 58 |
|
59 | 59 | if (!serverEnv) throw new Error("Server environment not found"); |
60 | 60 | if (!isRunnableDevEnvironment(serverEnv)) |
61 | 61 | throw new Error("Server environment is not runnable"); |
62 | 62 |
|
| 63 | + const h3App = createApp(); |
| 64 | + |
63 | 65 | h3App.use( |
64 | | - eventHandler({ |
65 | | - onRequest: async e => { |
66 | | - if (!middleware) return; |
67 | | - const middlewareEntry = await serverEnv.runner.import(middleware); |
68 | | - const { |
69 | | - onRequest |
70 | | - }: { onRequest?: _RequestMiddleware<Request>[] | _RequestMiddleware<Request> } = |
71 | | - middlewareEntry?.default || {}; |
72 | | - if (Array.isArray(onRequest)) { |
73 | | - onRequest?.forEach(handler => handler(e)); |
74 | | - } else { |
75 | | - onRequest?.(e); |
76 | | - } |
77 | | - }, |
78 | | - onBeforeResponse: async (e, response) => { |
79 | | - if (!middleware) return; |
80 | | - const middlewareEntry = await serverEnv.runner.import(middleware); |
81 | | - const { |
82 | | - onBeforeResponse |
83 | | - }: { |
84 | | - onBeforeResponse?: |
85 | | - | _ResponseMiddleware<Request, Response>[] |
86 | | - | _ResponseMiddleware<Request, Response>; |
87 | | - } = middlewareEntry?.default || {}; |
88 | | - if (Array.isArray(onBeforeResponse)) { |
89 | | - onBeforeResponse?.forEach(handler => handler(e, response)); |
90 | | - } else { |
91 | | - onBeforeResponse?.(e, response); |
92 | | - } |
93 | | - }, |
94 | | - handler: async event => { |
95 | | - try { |
96 | | - const serverEntry: { |
97 | | - default: (e: H3Event) => Promise<Response>; |
98 | | - } = await serverEnv.runner.import("./src/entry-server.tsx"); |
| 66 | + eventHandler(async (event) => { |
| 67 | + const serverEntry: { |
| 68 | + default: EventHandler; |
| 69 | + } = await serverEnv.runner.import("./src/entry-server.tsx"); |
99 | 70 |
|
100 | | - return await serverEntry.default(event); |
101 | | - } catch (e) { |
102 | | - console.error(e); |
103 | | - viteDevServer.ssrFixStacktrace(e as Error); |
104 | | - if (getHeader(event, "content-type")?.includes("application/json")) { |
105 | | - return sendWebResponse( |
106 | | - event, |
107 | | - new Response( |
108 | | - JSON.stringify( |
109 | | - { |
110 | | - status: 500, |
111 | | - error: "Internal Server Error", |
112 | | - message: "An unexpected error occurred. Please try again later.", |
113 | | - timestamp: new Date().toISOString() |
114 | | - }, |
115 | | - null, |
116 | | - 2 |
117 | | - ), |
118 | | - { |
119 | | - status: 500, |
120 | | - headers: { |
121 | | - "Content-Type": "application/json" |
122 | | - } |
123 | | - } |
124 | | - ) |
125 | | - ); |
126 | | - } |
| 71 | + return await serverEntry.default(event).catch((e: unknown) => { |
| 72 | + console.error(e); |
| 73 | + viteDevServer.ssrFixStacktrace(e as Error); |
| 74 | + if ( |
| 75 | + getHeader(event, "content-type")?.includes( |
| 76 | + "application/json", |
| 77 | + ) |
| 78 | + ) { |
127 | 79 | return sendWebResponse( |
128 | 80 | event, |
129 | 81 | new Response( |
130 | | - ` |
131 | | - <!DOCTYPE html> |
132 | | - <html lang="en"> |
133 | | - <head> |
134 | | - <meta charset="UTF-8" /> |
135 | | - <title>Error</title> |
136 | | - <script type="module"> |
137 | | - import { ErrorOverlay } from '/@vite/client' |
138 | | - document.body.appendChild(new ErrorOverlay(${JSON.stringify( |
139 | | - prepareError(event.node.req, e) |
140 | | - ).replace(/</g, "\\u003c")})) |
141 | | - </script> |
142 | | - </head> |
143 | | - <body> |
144 | | - </body> |
145 | | - </html> |
146 | | - `, |
| 82 | + JSON.stringify( |
| 83 | + { |
| 84 | + status: 500, |
| 85 | + error: "Internal Server Error", |
| 86 | + message: |
| 87 | + "An unexpected error occurred. Please try again later.", |
| 88 | + timestamp: new Date().toISOString(), |
| 89 | + }, |
| 90 | + null, |
| 91 | + 2, |
| 92 | + ), |
147 | 93 | { |
148 | 94 | status: 500, |
149 | 95 | headers: { |
150 | | - "Content-Type": "text/html" |
151 | | - } |
152 | | - } |
153 | | - ) |
| 96 | + "Content-Type": "application/json", |
| 97 | + }, |
| 98 | + }, |
| 99 | + ), |
154 | 100 | ); |
155 | 101 | } |
156 | | - } |
157 | | - }) |
| 102 | + return sendWebResponse( |
| 103 | + event, |
| 104 | + new Response( |
| 105 | + ` |
| 106 | + <!DOCTYPE html> |
| 107 | + <html lang="en"> |
| 108 | + <head> |
| 109 | + <meta charset="UTF-8" /> |
| 110 | + <title>Error</title> |
| 111 | + <script type="module"> |
| 112 | + import { ErrorOverlay } from '/@vite/client' |
| 113 | + document.body.appendChild(new ErrorOverlay(${JSON.stringify( |
| 114 | + prepareError( |
| 115 | + event.node.req, |
| 116 | + e, |
| 117 | + ), |
| 118 | + ).replace(/</g, "\\u003c")})) |
| 119 | + </script> |
| 120 | + </head> |
| 121 | + <body> |
| 122 | + </body> |
| 123 | + </html> |
| 124 | + `, |
| 125 | + { |
| 126 | + status: 500, |
| 127 | + headers: { |
| 128 | + "Content-Type": "text/html", |
| 129 | + }, |
| 130 | + }, |
| 131 | + ), |
| 132 | + ); |
| 133 | + }) |
| 134 | + } |
| 135 | + ), |
158 | 136 | ); |
159 | 137 |
|
160 | 138 | viteDevServer.middlewares.use(async (req, res) => { |
@@ -324,9 +302,8 @@ function removeHtmlMiddlewares(server: ViteDevServer) { |
324 | 302 | function prepareError(req: Connect.IncomingMessage, error: unknown) { |
325 | 303 | const e = error as Error; |
326 | 304 | return { |
327 | | - message: `An error occured while server rendering ${req.url}:\n\n\t${ |
328 | | - typeof e === "string" ? e : e.message |
329 | | - } `, |
| 305 | + message: `An error occured while server rendering ${req.url}:\n\n\t${typeof e === "string" ? e : e.message |
| 306 | + } `, |
330 | 307 | stack: typeof e === "string" ? "" : e.stack |
331 | 308 | }; |
332 | 309 | } |
0 commit comments