diff --git a/.changeset/tall-balloons-explain.md b/.changeset/tall-balloons-explain.md new file mode 100644 index 000000000000..51fa17461a95 --- /dev/null +++ b/.changeset/tall-balloons-explain.md @@ -0,0 +1,6 @@ +--- +'@modern-js/server-core': patch +--- + +fix: Compatible with http-compression, make sure res.end is called before executing the subsequent code +fix: 兼容 http-compression,确保执行后续代码前,res.end 先被调用 diff --git a/packages/server/core/src/base/adapters/node/polyfills/stream.ts b/packages/server/core/src/base/adapters/node/polyfills/stream.ts index 06125ef09d9c..1d7ee0a6dee6 100644 --- a/packages/server/core/src/base/adapters/node/polyfills/stream.ts +++ b/packages/server/core/src/base/adapters/node/polyfills/stream.ts @@ -20,20 +20,29 @@ export async function writeReadableStreamToWritable( const flushable = writable as { flush?: Function }; try { - while (true) { - const { done, value } = await reader.read(); - - if (done) { - writable.end(); - break; - } + await new Promise((resolve, reject) => { + writable.on('finish', resolve); + writable.on('error', reject); + + const writeAndFlush = async () => { + while (true) { + const { done, value } = await reader.read(); + + if (done) { + writable.end(); + break; + } + + writable.write(value); + if (typeof flushable.flush === 'function') { + flushable.flush(); + } + } + }; - writable.write(value); - if (typeof flushable.flush === 'function') { - flushable.flush(); - } - } - } catch (error: unknown) { + writeAndFlush().catch(reject); + }); + } catch (error) { writable.destroy(error as Error); throw error; }