javascript - 数据未转换 Node.js 转换流

标签 javascript json node.js nodejs-stream through2

我正在尝试创建一个转换流,从 socket.io 获取数据,将其转换为 JSON,然后将其发送到 stdout。我完全困惑为什么数据似乎没有任何转换就直接通过。我正在使用 through2 库。这是我的代码:

getStreamNames().then(streamNames => {
        const socket = io(SOCKETIO_URL);
        socket.on('connect', () => {
            socket.emit('Subscribe', {subs: streamNames});
        });

        const stream = through2.obj(function (chunk, enc, callback) {
            callback(null, parseString(chunk))
        }).pipe(through2.obj(function (chunk, enc, callback) {
            callback(null, JSON.stringify(chunk));
        })).pipe(process.stdout);

        socket.on('m', data => stream.write(data));

    },
);

getStreamNames 返回一个解析为流名称数组的 promise (我正在调用外部 socket.io API)和 parseString获取从 API 返回的字符串并将其转换为 JSON,以便于管理。

我正在寻找的是我的控制台,用于在使用parseString解析它之后打印出字符串化的JSON,然后使用JSON.stringify使其成为标准输出>。实际发生的情况是数据直接通过流并且不进行任何转换。

仅供引用,来自 API 的数据采用奇怪的格式,类似于

field1~field2~0x23~fieldn

这就是为什么我需要 parseString 方法。

我一定错过了什么。有什么想法吗?

编辑:

解析字符串:

function(value) {
    var valuesArray = value.split("~");
    var valuesArrayLenght = valuesArray.length;
    var mask = valuesArray[valuesArrayLenght - 1];
    var maskInt = parseInt(mask, 16);
    var unpackedCurrent = {};
    var currentField = 0;
    for (var property in this.FIELDS) {
        if (this.FIELDS[property] === 0) {
            unpackedCurrent[property] = valuesArray[currentField];
            currentField++;
        }
        else if (maskInt & this.FIELDS[property]) {
            if (property === 'LASTMARKET') {
                unpackedCurrent[property] = valuesArray[currentField];
            }
            else {
                unpackedCurrent[property] = parseFloat(valuesArray[currentField]);
            }
            currentField++;
        }
    }

    return unpackedCurrent;
};

谢谢

最佳答案

问题是您正在编写的流实际上是 process.stdout,因为 .pipe 返回最后一个 stream.Writable ,因此您可以继续链接,在您的情况下,process.stdout

const x = stream.pipe(stream2).pipe(stream3).pipe(process.stdout);
x === process.stdout // true

因此,您所做的只是:process.stdout.write(data),而不通过管道。

您需要做的是将第一个 through2 流分配给 stream 变量,然后将 .pipe 分配给该流。

const stream = through2.obj((chunk, enc, callback) => {
    callback(null, parseString(chunk))
});

stream
    .pipe(through2.obj((chunk, enc, callback) => {
        callback(null, JSON.stringify(chunk));
    }))
    .pipe(process.stdout);

socket.on('m', data => stream.write(data));

关于javascript - 数据未转换 Node.js 转换流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50537469/

相关文章:

javascript - 如何根据mongodb中引用文档中的字段进行查询

javascript - 按钮不显示

javascript - NodeJS 中是否有任何简单的方法可以将多部分/表单数据转换为数组?

node.js - NodeJs fs.watch/FSWatcher 错误

javascript - paper.js - 使用闭合路径实现更平滑的边缘

javascript - Facebook 和 iFrame

json - 解码不规则的 JSON 文件

android - 遍历嵌套的 json 数组是将先前分配的值添加到数据模型

python - 如何在 Django REST 框架中返回自定义 JSON

javascript - 在 Node js 中模拟浏览器