So I was working on my personal project and for some reason my nodejs part of the applications keeps crashing. I dont know the reason i have been trying to find the error in the code but so far their is not particualr progress.
The Error is –
Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
at new NodeError (node:internal/errors:406:5)
at ServerResponse.setHeader (node:_http_outgoing:652:11)
at ServerResponse.header (C:UsersdevgargDownloadsProjectsReact ProjectsCENACLEservernode_modulesexpresslibresponse.js:776:10)
at ServerResponse.json (C:UsersdevgargDownloadsProjectsReact ProjectsCENACLEservernode_modulesexpresslibresponse.js:264:10)
at PassThrough.<anonymous> (file:///C:/Users/devgarg/Downloads/Projects/React%20Projects/CENACLE/server/controller/post.js:32:17)
at PassThrough.emit (node:events:526:35)
at PassThrough.emit (node:domain:488:12)
at Request.<anonymous> (C:UsersdevgargDownloadsProjectsReact ProjectsCENACLEservernode_modulesaws-sdklibrequest.js:590:14)
at Request.callListeners (C:UsersdevgargDownloadsProjectsReact ProjectsCENACLEservernode_modulesaws-sdklibsequential_executor.js:106:20)
at Request.emit (C:UsersdevgargDownloadsProjectsReact ProjectsCENACLEservernode_modulesaws-sdklibsequential_executor.js:78:10) {
code: 'ERR_HTTP_HEADERS_SENT',
time: 2024-04-24T17:46:46.189Z
}
Node.js v20.9.0
It shows that the error is in server -> controller -> post.js
at line 32
.
The Function where the error shown is fetching the images from AWS S3 Bucket and sending them to the client end. I tried stop sending response if the same request is performed again. But it didnt resolve the issue.
let readStreams = {};
export const getPost = (req, res) => {
const Key = req.path.split('/')[1];
// If there is a read stream in progress for this key, destroy it
if (readStreams[Key]) {
readStreams[Key].destroy();
}
readStreams[Key] = getFile(Key);
// Flag to check if response has been sent
let responseSent = false;
// Handle errors
readStreams[Key].on("error", (err) => {
if (!responseSent) {
res.json({ error: "An error occurred while reading the stream" });
responseSent = true;
}
});
// Pipe the stream to the response
readStreams[Key].pipe(res);
// Close the stream after it's finished processing
readStreams[Key].on("end", () => {
if (!responseSent) {
readStreams[Key].destroy();
responseSent = true;
}
delete readStreams[Key]; // Remove the read stream once finished
});
}
This is the fucntion where it is showing the error but i m not sure if it really is the root cause.
You can view the whole code on my github if required :-
https://github.com/Dev771/CENACLE
I tried to limit the image request coming and also only resolving the last request that comes.
I enabled error handling in case their were any crash due to the stream but that didnt resolve the issue either.