Node.js nodejs express-大数据块在res.on('data')中记录了两次

Node.js nodejs express-大数据块在res.on('data')中记录了两次,node.js,rest,express,chunks,Node.js,Rest,Express,Chunks,我在nodeJS中遇到了一个问题,据我所知,它是异步的,但我无法处理它,我也没有找到解决我的具体问题的方法 我目前正在实现一个服务器,它每x秒轮询一次来自另一台服务器的数据。然后,我使用外部服务器响应的数据块(JSON字符串)来接收必要的实时数据,然后解析并保存到我的mongoDB。 问题是,区块有时相当长,因为服务器有时传输许多行 因此,有时候我的工具已经在块不太大的时候起作用了,但有时候它不起作用。记录完区块后,我注意到在这些情况下,区块记录了两次 例如,如果res.data看起来像这样:[

我在nodeJS中遇到了一个问题,据我所知,它是异步的,但我无法处理它,我也没有找到解决我的具体问题的方法

我目前正在实现一个服务器,它每x秒轮询一次来自另一台服务器的数据。然后,我使用外部服务器响应的数据块(JSON字符串)来接收必要的实时数据,然后解析并保存到我的mongoDB。 问题是,区块有时相当长,因为服务器有时传输许多行

因此,有时候我的工具已经在块不太大的时候起作用了,但有时候它不起作用。记录完区块后,我注意到在这些情况下,区块记录了两次

例如,如果res.data看起来像这样:[1123][9234]在现实中,它当然要大得多,我会记录:

区块:[1123 ][9234]

这会破坏我的var响应,也就是response:[9234]。 以下是代码的重要部分:

function pollUra() {
var response = '';
var deferred = Q.defer();

// Send a request to URAv2
var req = http.request(options, function (res) {

    res.setEncoding('utf-8');

    res.on('data', function (chunk) {
        // We need to set response to null here, because if there is too many data in the chunk,
        // the response concatenates chunk after chunk, while chunk is concatenated by its seperate parts.
        // chunk1 -> chunk1+chunk2 -> chunk1+chunk2+chunk3
        // response = chunk1 -> chunk1+chunk1+chunk2 -> chunk1+chunk1+chunk2+chunk1+chunk2+chunk3...
        console.log('chunk: '+chunk);
        response = '';
        response += chunk;


    });


    res.on('end', function () {
        var parsedResponseArray = parser.parseQuery(response);
    ...
    }
我认为评论中描述的解决方案解决了这个问题,因为它在当时似乎大部分时间都有效,但现在似乎只是幸运的是,这一块没有变得足够大,无法承受更长时间的失败

我的愿望是在数据块完全发送后捕获它,但不知何故我无法找到解决方案,因为我认为res.on'end'是在数据块完全发送后调用的

我错过了什么

提前谢谢

删除行响应=;在“数据”上的资源内部

否则代码看起来不错,问题是重新初始化响应变量。因此,每次到达新数据块时,都会擦除以前保存的数据块

引用你的话:

例如,如果res.data在中如下所示:[1123][9234] 真的,当然要大得多,我被记录下来了:

区块:[1123区块][9234]

注意块1+2=[1123][9234]

因此,代码必须是您拥有的代码,但不重置响应变量:

// Send a request to URAv2
var req = http.request(options, function (res) {

    res.setEncoding('utf-8');

    response = ''; // Reset variable in case it is not empty
    res.on('data', function (chunk) {
        // We need to set response to null here, because if there is too many data in the chunk,
        // the response concatenates chunk after chunk, while chunk is concatenated by its seperate parts.
        // chunk1 -> chunk1+chunk2 -> chunk1+chunk2+chunk3
        // response = chunk1 -> chunk1+chunk1+chunk2 -> chunk1+chunk1+chunk2+chunk1+chunk2+chunk3...
        console.log('chunk: '+chunk);
        response += chunk;


    });


    res.on('end', function () {
        var parsedResponseArray = parser.parseQuery(response);
    ...
    }
删除行response=;在“数据”上的资源内部

否则代码看起来不错,问题是重新初始化响应变量。因此,每次到达新数据块时,都会擦除以前保存的数据块

引用你的话:

例如,如果res.data在中如下所示:[1123][9234] 真的,当然要大得多,我被记录下来了:

区块:[1123区块][9234]

注意块1+2=[1123][9234]

因此,代码必须是您拥有的代码,但不重置响应变量:

// Send a request to URAv2
var req = http.request(options, function (res) {

    res.setEncoding('utf-8');

    response = ''; // Reset variable in case it is not empty
    res.on('data', function (chunk) {
        // We need to set response to null here, because if there is too many data in the chunk,
        // the response concatenates chunk after chunk, while chunk is concatenated by its seperate parts.
        // chunk1 -> chunk1+chunk2 -> chunk1+chunk2+chunk3
        // response = chunk1 -> chunk1+chunk1+chunk2 -> chunk1+chunk1+chunk2+chunk1+chunk2+chunk3...
        console.log('chunk: '+chunk);
        response += chunk;


    });


    res.on('end', function () {
        var parsedResponseArray = parser.parseQuery(response);
    ...
    }

您需要将数据写入文件\保存在字典中。既然一切都是异步的,那么当您同时访问这些文件时会发生什么呢?您必须以某种方式确定每个块的目的地,并将其分配到正确的位置。您需要将数据写入文件\将其保存在字典中。既然一切都是异步的,那么当您同时访问这些文件时会发生什么呢?你必须以某种方式确定每个块的目的地,并分配到正确的位置。遗憾的是,这并不能解决问题,我已经尝试过了。这肯定是res.on'data'-块被调用了两次。我使用在数据块中迭代的迭代器对其进行了测试,如果数据块很大,迭代器将被一次迭代。如果没有,它就没有。因此,我可以简单地使用两个字符串,即response1和response2,并在iter>0时将response2与第二个块连接起来,但我无法想象这应该是解决这个问题的唯一方法……你没有抓住要点。多次触发“数据”事件是正常操作。这就是TCP/IP协议本身的体系结构。您会收到两次或更多的数据,如果您将所有内容汇总在一起,最终您将看到所需的完整数据。是的,我已经知道了,只需使用迭代器对其进行测试,以100%确定问题所在。我想说的是,如果我从函数内部删除var响应,失败仍然会发生。但也许要澄清这一点:然后我使用一个全局变量来存储块。即使不应该重新初始化全局变量,仍然会出现故障。这只是函数pollUra,由setTimeout循环。如果我在分析数据块中的数据块,我当然会得到一个错误,因为我的解析器试图分析数据块的每一部分。哦,明白了。在下一次服务器轮询之前,我忘记了空响应。非常感谢。不能投票支持你的答案,因为我需要15个声誉哦,明白了。在下一次服务器轮询之前,我忘记了空响应。非常感谢。无法投票支持你的答案,因为我需要15个声誉:解决了我的问题,但不知道背后的原因。很遗憾,这个问题没有解决,我已经试过了。这肯定是res.on'data'-块被调用了两次。我使用在数据块a中迭代的迭代器对其进行了测试
nd如果数据块很大,迭代器将被1迭代。如果没有,它就没有。因此,我可以简单地使用两个字符串,即response1和response2,并在iter>0时将response2与第二个块连接起来,但我无法想象这应该是解决这个问题的唯一方法……你没有抓住要点。多次触发“数据”事件是正常操作。这就是TCP/IP协议本身的体系结构。您会收到两次或更多的数据,如果您将所有内容汇总在一起,最终您将看到所需的完整数据。是的,我已经知道了,只需使用迭代器对其进行测试,以100%确定问题所在。我想说的是,如果我从函数内部删除var响应,失败仍然会发生。但也许要澄清这一点:然后我使用一个全局变量来存储块。即使不应该重新初始化全局变量,仍然会出现故障。这只是函数pollUra,由setTimeout循环。如果我在分析数据块中的数据块,我当然会得到一个错误,因为我的解析器试图分析数据块的每一部分。哦,明白了。在下一次服务器轮询之前,我忘记了空响应。非常感谢。不能投票支持你的答案,因为我需要15个声誉哦,明白了。在下一次服务器轮询之前,我忘记了空响应。非常感谢。无法投票支持你的答案,因为我需要15个声誉:解决了我的问题,但不知道背后的原因