node.js服务器未接收所有二进制数据(或客户端未发送所有二进制数据)
我是node.js的新手,遇到了一个可能非常基本的问题,我确信我没有“得到”什么,但我们来看看: 我有两个程序node.js服务器未接收所有二进制数据(或客户端未发送所有二进制数据),node.js,binary,express,request,Node.js,Binary,Express,Request,我是node.js的新手,遇到了一个可能非常基本的问题,我确信我没有“得到”什么,但我们来看看: 我有两个程序 server.js是一个简单的express/node.js服务器,它接受二进制数据的POST client.js是一个简单的request/node.js客户端,它将大文件的内容流式传输到服务器 我一直在寻找建议,我想我有一个小例子: 客户: var fs = require('fs'); var request = require('request'); fs.createRe
- server.js是一个简单的express/node.js服务器,它接受二进制数据的POST
- client.js是一个简单的request/node.js客户端,它将大文件的内容流式传输到服务器
var fs = require('fs');
var request = require('request');
fs.createReadStream('test2.zip').pipe(request.post('http://localhost:3000/'));
服务器:
var express = require('express');
var app = express();
app.post('/', function(req, res){
var size = 0;
req.on('data', function (data) {
size += data.length;
console.log('Got chunk: ' + data.length + ' total: ' + size);
});
req.on('end', function () {
console.log("total size = " + size);
});
req.on('error', function(e) {
console.log("ERROR ERROR: " + e.message);
});
res.send("Thanks");
});
app.listen(3000);
console.log('Listening on port 3000');
当我发送一个小文件或在Chrome中发布来自外部客户端(如Advanced REST client)的数据时,我看到了我的预期:
Got chunk: 481 total: 481
total size = 481
但如果我发送一个大文件,我会看到一堆数据通过,然后它就会停止:
Got chunk: 65405 total: 65405
Got chunk: 131 total: 65536
Got chunk: 65396 total: 130932
Got chunk: 140 total: 131072
Got chunk: 65387 total: 196459
Got chunk: 149 total: 196608
Got chunk: 65378 total: 261986
Got chunk: 158 total: 262144
Got chunk: 65369 total: 327513
Got chunk: 167 total: 327680
Got chunk: 65360 total: 393040
Got chunk: 176 total: 393216
Got chunk: 65351 total: 458567
Got chunk: 185 total: 458752
Got chunk: 65342 total: 524094
Got chunk: 194 total: 524288
Got chunk: 65333 total: 589621
Got chunk: 203 total: 589824
Got chunk: 65324 total: 655148
Got chunk: 212 total: 655360
Got chunk: 15898 total: 671258
看起来数据停止时没有调用“end”。同样有趣的是,数据是以大/小数据块的形式出现的
有什么想法吗?express被二进制数据阻塞了吗
node.js v0.10.7,express v3.2.4,request v2.21.0编辑:您有两个错误
res.end
end
事件之前调用res.send
server.js
代码段,其中res.end
行是有趣的移动/更改
app.post('/', function(req, res){
var size = 0;
req.on('data', function (data) {
size += data.length;
console.log('Got chunk: ' + data.length + ' total: ' + size);
});
req.on('end', function () {
console.log("total size = " + size);
res.end("Thanks");
});
req.on('error', function(e) {
console.log("ERROR ERROR: " + e.message);
});
});
使用该修复程序,无论大小测试文件都能正常工作。感谢您的快速响应。关于保持活力的有趣想法。由于客户端立即终止,我认为套接字将关闭,但我知道服务器可能看不到这一点。我可以禁用keep alive,看看这是否会改变什么。但有些事情仍然不对劲。该文件是243967953字节,但我只看到其中的一小部分。另外,通过一个小文件,我得到了使用相同代码的“end”调用。。。可能与文件的大小有关。嗯,我认为这是1个块与N个块的区别。当我将client.js运行到一个只有
nc-l 3000
的模拟服务器时,客户端挂起,TCP连接打开。确实如此,它正在等待服务器的HTTP响应,对吗?具体来说,它正在等待一个完整的响应,这是单个res.send
无法完成的。但是还有一个时间问题,你的代码在读取所有请求体之前发送响应数据,这可能没问题,但我必须对此进行研究,以了解是否存在边缘情况。就是这样!完全有道理。非常感谢你的帮助。我知道这必须是一些基本的东西。。。我还没有异步思考。