feat(express): add support for readable stream already closed #13992
+242
−148
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Description
This change resolves an issue where the request body is inaccessible to
react-router
when a Node.js server, such as Express, uses middleware that consumes the request stream before it reaches the router's handler.Fixes: remix-run/remix#10132
The Problem
In Node.js applications, it's common to use middleware like
express.json()
orexpress.urlencoded()
to parse the request body. This process reads and consumes the request'sReadableStream
.Since Node.js streams cannot be consumed more than once (unlike the Web API's
ReadableStream
which can be cloned using the.tee()
method),react-router
is subsequently unable to read the request body. This is a frequent issue in applications that layerreact-router
with other Express middleware.This PR introduces a new check to verify if the request stream has already been closed. If it has, the handler will now fallback to using the body that was already parsed and it transform it to string.