【问题标题】:How can I 'accumulate' a raw stream in Node.js?如何在 Node.js 中“累积”原始流?
【发布时间】:2012-05-28 00:49:15
【问题描述】:

目前我将所有内容连接成一个字符串,如下所示

var body = '';
res.on('data', function(chunk){
    body += chunk;
});

如何保存和累积原始流,以便将原始字节传递给期望字节而不是字符串的函数?

【问题讨论】:

    标签: node.js stream


    【解决方案1】:

    更好地使用Buffer.concat - 更简单。在 Node v0.8+ 中可用。

    var chunks = [];
    res.on('data', function(chunk) { chunks.push(chunk); });
    res.on('end', function() {
        var body = Buffer.concat(chunks);
        // Do work with body.
    });
    

    【讨论】:

    • 更好的方法。为我节省了大量时间,谢谢
    • 这应该是公认的答案 - 没有库,没有弃用的 api。谢谢大佬!
    • 我遇到了这个错误[ERR_INVALID_ARG_TYPE]: The "list[0]" argument must be one of type Buffer or Uint8Array. Received type string
    【解决方案2】:

    首先,检查这些函数实际上是否需要一次性使用所有字节。他们确实应该接受'data' 事件,这样您就可以按照收到它们的顺序传递缓冲区。

    无论如何,这里有一个蛮力的方法来连接所有数据块缓冲区而不解码它们:

    var bodyparts = [];
    var bodylength = 0;
    res.on('data', function(chunk){
        bodyparts.push(chunk);
        bodylength += chunk.length;
    });
    res.on('end', function(){
        var body = new Buffer(bodylength);
        var bodyPos=0;
        for (var i=0; i < bodyparts.length; i++) {
            bodyparts[i].copy(body, bodyPos, 0, bodyparts[i].length);
            bodyPos += bodyparts[i].length;
        }
        doStuffWith(body); // yay
    });
    

    【讨论】:

    • 什么是.copy()方法?
    【解决方案3】:

    或者,您也可以使用 node.js 库,例如 bl 或 concat-stream:

    'use strict'
    let http = require('http')
    let bl = require('bl')
    http.get(url, function (response) {
      response.pipe(bl(function (err, data) {
        if (err)
          return console.error(err)
        console.log(data)
      }))
    })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-28
      • 2018-11-16
      • 2023-03-27
      • 2016-02-07
      • 1970-01-01
      • 1970-01-01
      • 2020-05-23
      相关资源
      最近更新 更多