POST リクエストでペイロード部分をサーバー側でちゃんと受け取れてないケースがあって 原因調査のためにあれこれやってると再現したりしなかったり
余計なライブラリなしで 再現性がある程度あるものが用意できた と思ったら別原因で別の問題になってました

その時のコードがこんなの

[server.js]
require("http").createServer((req, res) => {
let size = 0
req.on("data", (chunk) => {
console.log("DATA", chunk.length, size += chunk.length)
})
req.on("end", () => {
console.log("END")
})
req.on("error", (err) => {
console.log("ERROR", err)
})
res.end("ok")
}).listen(8000)

[client.js]
const fs = require("fs")
const { request } = require("http")

const data = "abcd".repeat(1024 * 100)
fs.writeFileSync("tmp", data)

setInterval(() => {
const req = request({
hostname: "localhost",
port: 8000,
path: "/",
method: "POST",
headers: {
"Content-Type": "text/plain",
},
}, res => {
const buffers = []
res.on("data", (chunk) => {
buffers.push(chunk)
console.log("RES DATA", chunk.length)
})
res.on("end", () => {
const response = Buffer.concat(buffers).toString()
console.log("RES END", response)
})
})

req.on("finish", () => {
console.log("REQ FINISH")
})
req.on("error", (err) => {
console.log("REQ ERROR", err)
})

fs.createReadStream("tmp").pipe(req)
}, 1000 * 10)

fetch ではなく request を使っていたり 一旦ファイルに書き込んで readable stream を pipe しているのは 元の現象が発生したときに使っていたライブラリの内部実装に合わせたためです

出力は

[client]
> node .\client.js
REQ FINISH
RES DATA 2
RES END ok
RES DATA 2
RES END ok
RES DATA 2
RES END ok
RES DATA 2
RES END ok
RES DATA 2
RES END ok

[server]
> node .\server.js
DATA 65390 65390
DATA 146 65536
DATA 65381 130917
DATA 155 131072
DATA 65372 196444
DATA 164 196608
DATA 65363 261971
DATA 173 262144
DATA 65354 327498
DATA 182 327680
DATA 65345 393025
DATA 191 393216
DATA 16384 409600
END
DATA 65390 65390
DATA 146 65536
DATA 65381 130917
DATA 155 131072
DATA 65372 196444
DATA 164 196608
DATA 65390 65390
DATA 146 65536
DATA 65381 130917
DATA 155 131072
DATA 65372 196444
DATA 164 196608
DATA 65390 65390
DATA 146 65536
DATA 65381 130917
DATA 155 131072
DATA 65390 65390
DATA 146 65536
DATA 65381 130917
DATA 155 131072
DATA 65372 196444
DATA 164 196608

分かりづらいですが 5 回分のリクエストがあります
1 回目は正常なのですが 2 回目以降はサーバー側に途中までしかデータが届いていません
DATA の行の 2 つめの数字がそのリクエストの合計バイト数なので 前の行より減っているところからが次のリクエストです
クライアント側ではレスポンスは受け取れていますが finish イベントが起きなくなっています

なんどかプロセスを再起動してみても最初だけが成功します

接続したままになってるのかと思って socket を見てみると 途中までの場合でも毎回ちゃんとクローズしてるようです
サーバー側のリクエストハンドラにこういうコードを追加します

	req.socket.on("close", () => {
console.log("SOCK CLOSE")
})
(略)
DATA 16384 409600
END
SOCK CLOSE

(略)
DATA 164 196608
SOCK CLOSE

(略)
DATA 164 196608
SOCK CLOSE

原因不明で苦戦していたのですが すごく単純な理由でした
サーバー側のリクエストハンドラではペイロードを取得するためのイベントリスナを設定してはいますが レスポンスは同期的に即返しています

レスポンスを返してしまってるので もう残りのリクエストのペイロードを送信する必要はないと判断して途中で切断してしまっているみたいです

	res.end("ok")

を req の end イベントのハンドラ内に移すと この現象は発生しなくなりました