Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
node.js服务器未接收所有二进制数据(或客户端未发送所有二进制数据)_Node.js_Binary_Express_Request - Fatal编程技术网

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

我是node.js的新手,遇到了一个可能非常基本的问题,我确信我没有“得到”什么,但我们来看看:

我有两个程序

  • 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
    无法完成的。但是还有一个时间问题,你的代码在读取所有请求体之前发送响应数据,这可能没问题,但我必须对此进行研究,以了解是否存在边缘情况。就是这样!完全有道理。非常感谢你的帮助。我知道这必须是一些基本的东西。。。我还没有异步思考。