node.js - 节点http。大文件传输失败,出现“ERR_STREAM_PREMATURE_CLOSE”
问题描述
我试图将 10 GB 数据从节点客户端发送到节点 http 服务器。它工作正常,直到我达到大约 5 GB。协议是http。
它工作正常,直到我达到大约 5 GB。我在服务器端遇到的错误是 [ERR_STREAM_PREMATURE_CLOSE],在客户端 RequestError: read ECONNRESET.
示例服务器:
const http = require('http')
const fs = require('fs')
const util = require('util')
const stream = require('stream')
const pipeline = util.promisify(stream.pipeline)
const host = 'localhost'
const port = 4000
const server = http.createServer(async (req, res) => {
try {
const writeStream = fs.createWriteStream('file', { encoding: 'binary' })
await pipeline(req, writeStream)
} catch (e) {
console.log(e)
}
})
server.listen(port, host, () => {
console.log(`Server is running on http://${host}:${port}`)
})
示例客户端
const got = require('got')
async function upload () {
await pipeline(fs.createReadStream(filename), got.stream.post('http://localhost:4000/upload'))
}
我尝试过使用不同的服务器(原始 http 和 express)和客户端(原始节点、请求、节点获取)。我也尝试过与 busboy 的 multipart。同样的问题。
我在 Mac 上尝试这个正在运行的节点 v14.4.0。
解决方案
我尝试在我的计算机上传输一个 10 GB 的文件,它对我有用。
服务器示例:
const http = require('http');
const fs = require('fs');
const PORT = 8333;
const server = http.createServer((req, res) => {
const writeStream = fs.createWriteStream('./result.txt');
req.pipe(writeStream);
req.on('end', () => {
console.log('The file was successfully written.');
res.end('OK');
});
});
server.listen(PORT, () => {
console.log(`Server has been started on port ${server.address().port}`);
});
客户端示例
const http = require('http');
const fs = require('fs');
function upload() {
const readStream = fs.createReadStream('./test.txt');
const request = http.request('http://localhost:8333', { method: 'POST' }, (res) => console.log(`STATUS: ${res.statusCode}`));
readStream.pipe(request);
readStream.on('end', () => request.end());
}
upload();
我并不是说这段代码非常正确,但是您可以尝试一下,因为它对我有用。
我在 Node.js v12.4.1 和 Windows 10 上运行了这个示例。
推荐阅读
- php - 在 laravel 中使用 stock 属性设置多对多关系
- c# - 如何在字符串中找到罗马数字并在 C# 中全部大写?
- c# - 有没有办法防止表单在#c 中多次显示?
- c# - 如何从可观察集合中获取对象?
- java - 如何使用 espresso 根据项目的文本从列表视图中单击项目?
- apache-kafka - 向 kafka 主题发送消息时出现 TimeoutException
- python - 将列表列表转换为数据框中的单列
- java - QueueChannel 的自动装配依赖项注入失败
- c# - SignalR 在等待 Start 时抛出 SocketException
- .net - 插值字符串 $ 被视为无效字符并返回错误 BC30037 (vb.net)