【问题标题】:nodejs decoded string from buffer returns multi line string来自缓冲区的nodejs解码字符串返回多行字符串
【发布时间】:2016-04-06 15:04:38
【问题描述】:

我有一个要解码的缓冲区,以便我可以将其视为一个对象。

我有以下设置

var StringDecoder = require('string_decoder').StringDecoder;

var req = http.request(reqOptions, function(res) {
    ...
    var decoder = new StringDecoder('utf8');

    res.on('data', function(chunk) {
        var textChunk = decoder.write(chunk);
        console.log(textChunk);
    });
});

textChunk returns - 注意这是多行的。

{"aaa":true,"bbb":true, "cc
c":true, "ddd":true, "eee":true, "f
ff":true, "ggg":true}

所以当我尝试将其转换为对象时

JSON.parse(textChunk) 

我收到Unexpected end of input

如何将我的字符串作为一行返回,以便我可以将其视为一个对象。

{"aaa":true,"bbb":true, "ccc":true, "ddd":true, "eee":true, "fff":true, "ggg":true}

【问题讨论】:

  • @ShanShan 有一个很好的答案。为什么 textChunk 以多行开头?您是否将其与 EOL 字符一起存储在 Firebase 中?
  • RTFM的经典案例,因为是多个console.log()...
  • @ShanShan 我的问题是在多行上显示块是否是有意作为存储在缓冲区中的原始数据的表示。

标签: javascript json node.js firebase buffer


【解决方案1】:

您需要创建一个字符串变量来连接所有块,然后在最后使用您的解码器。像这样的:

var text = '';

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

res.on('end', function() {
    var decoder = new StringDecoder('utf8');
    var result = decoder.write(text);
    // Do something with the result
});

【讨论】:

  • 很好地发现console.log() 将您传入的参数写入在其末尾换行。
  • @FrankvanPuffelen 是否存在缓冲区中的内容的问题,即是否有三个块传入导致需要连接它们?
  • 连接是必要的,尽管它在某种程度上取决于底层流如何公开数据。由于在这种情况下res 流以多个块的形式显示数据,因此需要将它们连接在一起以获得原始字符串。但是分块/连接不会引入新行。那些来自每次调用console.log()
  • 谢谢,我尝试了类似的方法,但在“关闭”时没有解码。正如你在我尝试关闭时建议的记录,当我尝试结束时我什么也没得到,这返回了我的预期。
【解决方案2】:

试试 request.js

npm install request -g --save

然后用管道代替结果,相信我会简单得多

整个 http.request / response 行将被替换为

res.pipe(url) 的结果是返回一个不错的对象,供服务、工厂或服务解析或使用

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-10
    • 2021-12-30
    • 1970-01-01
    • 2018-07-26
    • 2017-12-29
    • 1970-01-01
    相关资源
    最近更新 更多