-
-
Notifications
You must be signed in to change notification settings - Fork 33.5k
Description
This is with version 8.5.0 of node.
I have a situation where as the browser window is closing (or refreshing!) it sends a last ditch attempt to release locks that the user may hold. There is an api function for this which when it has completed calls response.end('{}')
(I have a convention that all api calls should return a valid json object even if its a null object).
I catch unhandled rejections and print the error stack, along with what url is being processed at the time. The url is a red herring (its a call several milliseconds into the new browser window starting up), but the error is real.
My server falls over with
Unhandled Rejection: Error [ERR_HTTP2_STREAM_CLOSED]: The stream is already closed
at Http2ServerResponse.write (internal/http2/compat.js:456:19)
at Http2ServerResponse.end (internal/http2/compat.js:479:12)
at API.module.exports (/home/alan/dev/pasv5/server/api/release_lock.js:32:14)
at <anonymous>
at process._tickCallback (internal/process/next_tick.js:188:7)
Request in Progress At time of Rejection:
url:/src/pas-notify.html
body:undefined
What I believe is happening is the api call gets through, takes a while to make a database call to release the locks, and then tries to send the response.end()
, by which time the original stream (and maybe even the session) have disappeared.
I would have expected from the new compatability api docs that request would have fired an 'aborted' event at some point before this happens, but I log those and nothing happened.
Looking at the compat code, I can see the error would not have thrown if a callback had been provided to response.write()
, but as is indicated in the stack this is called from response.end()
where no callback is passed through. Regardless of this issue I do have an on('error') listener on the response. and that wasn't fired either. Should the error be sent there?