nodejs express - 大块在 res.on('data') 中记录两次

nodejs express - big chunk is logged twice in res.on('data')

据我所知,我在 nodeJS 中遇到了异步问题,但我无法处理它,也没有找到解决我的特定问题的方法。

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

因此,有时只要块不是太大,我的工具就可以工作,但有时却不行。记录块后,我注意到在这些情况下,块被记录了两次。

例如,如果 res.data 看起来像这样:[1,"123"][9,"234"](实际上它当然要大得多)我会记录:

块:[1,”123 块 "][9,"234"]

这会破坏我的 var response,然后是 response: "][9,"234"]。 这是代码的重要部分:

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);
    ...
    }

我认为评论中描述的 soulition 解决了这个问题,因为它似乎大部分时间都有效,但现在看来这只是运气,块没有变得足够大以致失败时间更长。

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

我错过了什么?

提前致谢!

删除 res.on('data'...

中的 response = '';

否则代码看起来不错,问题是您重新初始化了 response 变量。因此,每次新数据到达时,先前保存的数据块都会被删除。


引用你的话:

For example if the res.data looks like this: [1,"123"][9,"234"] (in real it is of course much bigger) I get logged:

chunk: [1,"123 chunk "][9,"234"]

注意块 1 + 块 2 = [1,"123"][9,"234"]

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

// 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);
    ...
    }