Double Response (ERR_HTTP_HEADERS_SENT) in addProjectToCollection controller
Los mantenedores suelen responder en 3 días
@dpoppe7 ya está trabajando en esto.
Desde el 10/3/2026.
Evaluación
Este issue todavía no se ha evaluado.
Descripción
p5.js version
1.11.11
What is your operating system?
Mac OS
Web browser and version
Safari 17.6
Actual Behavior
The addProjectToCollection controller (found in server/controllers/collection.controller.js) contains a logic flaw in its Promise handling that leads to a server crash (ERR_HTTP_HEADERS_SENT).
When a validation error occurs (e.g. a collection or a project is not found), the updateCollection function correctly sends a failure response to the client. However, it then returns null to the next block in the Promise chain rather than "short-circuiting" the execution.
addProjectToCollection.js :
First response sent to client here.
Returning 'null' doesn't stop the Promise chain. It passes 'null' to the next .then() block.
function updateCollection([collection, project]) {
if (collection == null) {
sendFailure(404, 'Collection not found');
return null;
}
Then, even if updateCollection returned null, .then(populateReferences) runs.
Second response occurs when .then(sendSuccess), attempts to send 200OK and crash.
return Promise.all([collectionPromise, projectPromise])
.then(updateCollection)
.then(populateReferences)
.then(sendSuccess)
.catch(sendFailure);
Error in Terminal:
node:_http_outgoing:655
throw new ERR_HTTP_HEADERS_SENT('set');
^
Error: Cannot set headers after they are sent to the client
Expected Behavior
When a resource (Collection or Project) is not found, the server should respond with a 404 Not Found and terminate the request lifecycle immediately.
The Promise chain should be short-circuited so that subsequent .then() blocks (like populateReferences and sendSuccess) are never executed after a failure response has been sent. The Node process should remain operational, and no ERR_HTTP_HEADERS_SENT error should be triggered.
Steps to reproduce
Steps:
This bug is triggered by a race condition where the Frontend UI becomes "stale" due to actions in another session/tab. For example:
- Ensure user is logged in
- Open the p5.js Web Editor in two separate browser tabs (Tab A and Tab B).
- In Tab A: Open the "Add to Collection" modal for any sketch. The list of existing collections is displayed, if none, create one.
- In Tab B, delete the collection that you intend to add the sketch to.
- Back in Tab, click the button to add the sketch to that (now deleted) collection.
Observed Result: The server identifies the collection is missing, sends a 404, but then fails to stop execution, attempts a second response, and crashes the backend process.
Also happens when: user has a sketch open in Tab A, deletes it in Tab B, and then attempts to add the now deleted sketch from Tab A to a collection.
https://github.com/user-attachments/assets/f27acf43-2d59-4b4c-b5a5-2eb618369755
- Lenguaje dominante
- JavaScript
- Estrellas
- 1.7k
- Forks
- 1.7k
- Merge medio
- 3 d 18 h
- PR fusionados (30 d)
- 7
Preparar el entorno
- Incluye un Dockerfile o un archivo de Docker Compose
- Tiene una 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 processing/p5.js-web-editor
-
`PATCH /editor/project/visibility` returns 200 with `null` and doesn't update when `projectId` is a slugPosiblemente ocupada @Prbhtsgh la tomó hoy. AbiertoAwaiting Maintainer Approval Bug
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
processing/p5.js-web-editor#4348 · 3 comentarios ·
Los mantenedores suelen responder en 3 días
-
Fix: example.js stores defaultHTML function reference instead of calling it, causing examples to display raw JavaScript source in previewPosiblemente ocupada @syedbarkath980 la tomó hace 4 días. AbiertoAwaiting Maintainer Approval Bug
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
processing/p5.js-web-editor#4344 · 1 comentario ·
Los mantenedores suelen responder en 3 días
-
signup form gets stuck when signup request fails due to network errorPosiblemente ocupada @PS01K la tomó hace 34 días. AbiertoAwaiting Maintainer Approval Bug
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
processing/p5.js-web-editor#4285 · 3 comentarios ·
Los mantenedores suelen responder en 3 días
-
saveProject throws an error when a network request failsPosiblemente ocupada @dyk1454683243-sudo la tomó hace 6 días. AbiertoBug
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
processing/p5.js-web-editor#4276 · 3 comentarios · 1 asignado ·
Los mantenedores suelen responder en 3 días
-
Awaiting Maintainer Approval Enhancement
Dificultad 2/5 1-3 horas Aptitud para principiantes 82/100
processing/p5.js-web-editor#4270 · 1 comentario ·
Los mantenedores suelen responder en 3 días
Todos los issues de processing/p5.js-web-editor
Issues similares
-
bug(sight): the dashboard's text truncations split surrogate pairs and show broken charactersAbiertocomponent:sight
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
agentic-os-org/ANOLISA#6738 · 2 comentarios ·
Los mantenedores suelen responder en 1 día
-
bug Durable Agents Observability (AI Telemetry) status: needs triage
Dificultad 2/5 1-3 horas Aptitud para principiantes 82/100
mastra-ai/mastra#26470 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
feature/cohorts feature/feature-flags team/feature-flags
Dificultad 2/5 1-3 horas Aptitud para principiantes 74/100
Los mantenedores suelen responder en 1 día
-
documentation good first issue
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
Orbit-xyz/orbit-docs#11 ·
-
area/build area/tech debt
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
Los mantenedores suelen responder en 2 días