Middleware exceptions escape the generated handleRequest and bypass configureServerErrors
Los mantenedores suelen responder en 1 día
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 5/5
- Tiempo estimado
- Más de una semana
- Aptitud para principiantes
- 35/100
- Tipo de issue
- Error
- Claridad
- Bien especificado
- Estado de actividad
- Activo
- Stack tecnológico
- typescript, vite
Línea de trabajo
Start by reading src/ssr/index.ts around lines 1433-1453 and compare the server-function endpoint's handling of thrown Responses. Reproduce the production /boom case, then inspect src/node-entry/index.ts and the configureServerErrors path. Done means production middleware failures follow the stated response and error-policy behavior while dev retains its current overlay behavior.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Problem
In Start mode, the generated handleRequest runs the start.middleware chain without a catch:
When a middleware throws or rejects in a production build, the exception leaves handleRequest and each host deals with it in its own way:
- Nitro (h3) logs the original error with
console.errorand answers500with{"error":true,"status":500,"unhandled":true}as JSON. The headers and cookies the chain already wrote to the response stub are lost. start.nodelogs it and answers a plain-text 500 (src/node-entry/index.ts#L154-L161).- The
examples/start-ssrserver sendse.messageback to the client (examples/start-ssr/server.js#L78-L81).
Two consequences go beyond the inconsistent response:
- The hook registered with
configureServerErrors({ onError })never sees these failures, although its docs describe it as seeing "the failure that fails a request". Apps that rely on it to keep original errors out of logs, or to forward them to an APM (asstart.instrumentin #365 suggests), lose that for middleware, API handlers mounted in middleware, andstart.setup/start.renderModefailures. - A thrown control response turns into a 500.
return redirect('/login')from a middleware works, butthrow redirect('/login')reaches h3 as a non-Errorrejection and becomes an unhandled 500. The server-function endpoint, served by the same handler, already treats a thrownResponseas the response.
Reproduction
With @solidjs/vite-plugin 3.0.0-next.46, @solidjs/web 2.0.0-rc.11 and Nitro 3 beta:
// the module passed to start.middleware
export default async function middleware(request: Request, next: () => Promise<Response>) {
if (new URL(request.url).pathname === '/boom') throw new Error('token=abc123')
return next()
}
Build for production, serve it and request /boom: the response is Nitro's JSON 500, the server log shows Error: token=abc123 with its stack, and a hook registered with configureServerErrors is not called.
Expected
In production builds, the generated handler contains request failures the way the server-function endpoint does:
- a thrown
Response(exceptResponse.error()) or response envelope becomes the response; - anything else goes through the configured server error policy and yields a generic 500 that still carries the stub's headers and cookies;
- dev keeps the current behavior, so the Vite overlay still shows the original error.
Notes
- There is no public API today to run a value through the configured policy outside a render, so the handler would have to call the hook registered under the
configureServerErrorssymbol. A public entry point in@solidjs/webfor request failures, with its ownkindinServerErrorSite, would remove that coupling. - A later step could render the app's error boundary when the chain fails before the page render, so a failed navigation gets an HTML error page instead of an empty 500. Apps can do that in userland today, but it depends on the single-render rule and on excluding the server-function endpoint.
- Related: #328, since a deploy adapter would benefit from a handler that does not reject for application failures.
I'll follow up with a PR for the containment part.
- Lenguaje dominante
- TypeScript
- Estrellas
- 522
- Forks
- 72
- Merge medio
- 21 h 42 min
- PR fusionados (30 d)
- 35
Preparar el entorno
- Sin Dockerfile ni archivo de Docker Compose
- Sin plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de solidjs/solid-vite-plugin
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
solidjs/solid-vite-plugin#205 · 1 comentario · 2 reacciones ·
Los mantenedores suelen responder en 1 día
-
Dificultad 3/5 1-2 días Aptitud para principiantes 68/100
solidjs/solid-vite-plugin#391 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 4/5 3-5 días Aptitud para principiantes 55/100
solidjs/solid-vite-plugin#390 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 5/5 Más de una semana Aptitud para principiantes 35/100
solidjs/solid-vite-plugin#388 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
Dificultad 3/5 1-2 días Aptitud para principiantes 68/100
solidjs/solid-vite-plugin#387 ·
Los mantenedores suelen responder en 1 día
Todos los issues de solidjs/solid-vite-plugin
Issues similares
-
area/core status/need-triage
Dificultad 2/5 1-3 horas Aptitud para principiantes 88/100
google-gemini/gemini-cli#29602 ·
Los mantenedores suelen responder en 1 día
-
area: backend enhancement priority: low
Dificultad 2/5 1-3 horas Aptitud para principiantes 88/100
snapotter-hq/SnapOtter#1879 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 86/100
Tencent/BrowserSkill#390 ·
Los mantenedores suelen responder en 1 día
-
good first issue status: needs triaging type: bug version: 2.0
Dificultad 2/5 1-3 horas Aptitud para principiantes 85/100
medusajs/medusa#17094 · 2 comentarios ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 86/100
Los mantenedores suelen responder en 1 día