数据未被转换Node.js转换流

时间:2018-05-25 22:12:39

标签: 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返回一个声明,该声明解析为一组流名称(我正在调用外部socket.io API),parseString接受从API返回的字符串并转换它是JSON所以它是可管理的。

我正在寻找的是我的控制台,在我使用parseString对其进行解析之后打印出stringify' d JSON,然后使用JSON.stringify使其成为stdout-able。实际发生的是数据直接通过流并且不进行转换。

作为参考,来自API的数据采用奇怪的格式,如

field1~field2~0x23~fieldn

这就是我需要parseString方法的原因。

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

编辑:

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

由于

1 个答案:

答案 0 :(得分:2)

问题在于,您正在撰写的信息流实际上是process.stdout,因为.pipe会返回最后一个stream.Writable,因此您可以保留链接,在您的情况下,{ {1}}。

process.stdout

所以你所做的只是:const x = stream.pipe(stream2).pipe(stream3).pipe(process.stdout); x === process.stdout // true 而没有通过管道。

您需要做的是,将您的第一个process.stdout.write(data)流分配给through2变量,然后在该流上分配stream

.pipe