Javascript 未转换的数据Node.js转换流

Javascript 未转换的数据Node.js转换流,javascript,json,node.js,nodejs-stream,through2,Javascript,Json,Node.js,Nodejs Stream,Through2,我试图创建一个转换流,它从socket.io获取数据,将其转换为JSON,然后将其发送到stdout。我完全搞不懂为什么数据似乎没有经过任何转换就直接通过了。我正在通过2使用库。这是我的密码: getStreamNames().then(streamNames => { const socket = io(SOCKETIO_URL); socket.on('connect', () => { socket.emit('Subsc

我试图创建一个转换流,它从
socket.io
获取数据,将其转换为JSON,然后将其发送到stdout。我完全搞不懂为什么数据似乎没有经过任何转换就直接通过了。我正在通过2使用
库。这是我的密码:

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
将其标准化。实际发生的情况是数据直接通过流而不进行转换

作为参考,来自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;
};

谢谢

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

const x = stream.pipe(stream2).pipe(stream3).pipe(process.stdout);
x === process.stdout // true
因此,您所做的只是:
process.stdout.write(data)
,而无需经过管道

您需要做的是,将第一个
through2
流分配给
变量,然后在该流上分配
.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));

你能展示
parseString
方法吗?@MarcosCasagrande adddy你是救命恩人。