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

时间:2015-01-05 11:34:40

标签: node.js rest express chunks

我在nodeJS中遇到了一个问题,据我所知,这是异步,但我无法处理它,而且我找不到解决我特定问题的方法。

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

因此,有时我的工具已经可以在块不是太大的情况下工作,但有时它不会。记录块之后,我注意到在这些情况下,块会被记录两次。

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

chunk:[1," 123 chunk"] [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);
    ...
    }

我认为评论中描述的灵魂解决了这个问题,因为它似乎在大部分时间都有效,但现在似乎只是运气才能使大块没有变得足够大更长的时间。

我的愿望就是在完全发送之后抓住这个块但我无法找到解决方案,因为我认为res.on('end')只是在数据块完全被发送后才被调用。

我错过了什么?

提前致谢!

1 个答案:

答案 0 :(得分:3)

删除response = '';

中的行res.on('data'...

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


引述你:

  

例如,如果res.data看起来像这样:[1," 123"] [9," 234"](in   真的,它当然要大得多)我得到了记录:

     

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