buffer 上传大文件时, client 报错

2017-11-22 22:54:57 +08:00
 wingerwang

先贴出 client 和 server 的代码,node 的版本号为 v8.1.2

服务端代码:

// buffer_server.js

const fs = require('fs');
const http = require('http');
const zlib = require('zlib');

const server = http.createServer((req, res) => {
    let index = 0;
    req.on('data', function(chunk) {
        console.log(++index, chunk.length);
    });
    res.end('OK');
})

server.listen(3001, () => {
    console.log('started');
});

客户端代码:

// buffer_client.js
const fs = require('fs');
const http = require('http');
const zlib = require('zlib');
const path = require('path');

const filename = process.argv[2];
const server = process.argv[3];

const options = {
    port: 3001,
    hostname: server,
    method: 'PUT',
    protocol: 'http:',
    headers: {
        filename: path.basename(filename),
        'Content-Encoding': 'gzib'
    }
}

const req = http.request(options, (res) => {
    console.log('client done');
})
fs.readFile(filename, (err, buffer) => {
    console.log('获取文件完毕\n');
    console.log('开始压缩');
    zlib.gzip(buffer, (err, buffer) => {
        console.log('压缩完毕');
        console.log(buffer.length);  // 1336191186  1.2G 左右的文件
        req.write(new Buffer(1336191186));
        req.end();
    })
})

req.on('error', (err) => {
    console.log(err);
    /**
     * 
     * 出现的错误: 
     * 
     * { Error: read ECONNRESET
        at exports._errnoException (util.js:1016:11)
        at TCP.onread (net.js:609:25) code: 'ECONNRESET', errno: 'ECONNRESET', syscall: 'read' }
     */
})

req.on('data', (data) => {
    console.log(data, 'data');
})

```


问题是,在上传 1.2GB 左右的压缩文件,一次性去通过 write 去发送给 server 之后,client 会报错,报错信息如下:

```
{ Error: read ECONNRESET
    at exports._errnoException (util.js:1016:11)
    at TCP.onread (net.js:609:25) code: 'ECONNRESET', errno: 'ECONNRESET', syscall: 'read' }
```

我自己判定是因为一次性 write 的 buffer 数量太大造成的,求解具体原因 谢谢
1373 次点击
所在节点    问与答
3 条回复
ljcarsenal
2017-11-23 00:22:18 +08:00
虽然不知道怎么写 但直觉告诉我应该用 stream
hxsf
2017-11-23 07:54:43 +08:00
服务器端 提前断开了

应该在 req.on('end' 再去 res.send
wingerwang
2017-11-23 11:11:59 +08:00
@hxsf 应该在流全部到达之后,犯了个小错误 谢谢!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/408717

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX