【问题标题】:nodejs http. large file transfer fails with 'ERR_STREAM_PREMATURE_CLOSE'节点http。大文件传输失败,出现“ERR_STREAM_PREMATURE_CLOSE”
【发布时间】:2020-10-03 10:43:33
【问题描述】:

我正在尝试将 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。

【问题讨论】:

    标签: node.js http


    【解决方案1】:

    我尝试在我的计算机上传输一个 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 上运行了这个示例。

    【讨论】:

      猜你喜欢
      • 2019-02-14
      • 2010-10-08
      • 2020-03-09
      • 2012-07-04
      • 1970-01-01
      • 2011-11-27
      • 1970-01-01
      • 1970-01-01
      • 2022-08-24
      相关资源
      最近更新 更多