javascript - 如何使用 Node 变换将一个对象转换为另一个对象

标签 javascript node.js typescript node-streams transform-stream

我是 Node 流的新手,并试图找出为什么事情没有按预期工作。我只是在练习,想做一个愚蠢的转变。

interface MyTransformStreamOptions {
  [key: string]: any
}

class MyTransformStream extends Transform {
  constructor(options) {
    options.readableObjectMode = true;
    options.writableObjectMode = true;

    super(options);
  }

  _transform(chunk, encoding, callback) {
    console.log('encoding: ' + encoding);

    // chunk should be an object here, due to
    // readableObjectMode = true right?

    const newObj = {};

    for (const [key, value] of Object.entries(chunk)) {
      console.log(`[key, value]: [${key}, ${value}]`);
      newObj['aa' + key] = 'bb' + value;
    }

    callback(null, newObj);
  }
}

const myTransformStream = new MyTransformStream({} as MyTransformStreamOptions);

process.stdin
  .pipe(myTransformStream)
  .pipe(process.stdout);

最后我运行脚本并通过标准输入输入:

{ car: 'honda', truck: 'mazda' }

我也尝试过:

"{ car: 'honda', truck: 'mazda' }"

但是循环将 block 视为字符串而不是对象。所以我看到的输出如下:

[key, value]: [0, 123]
[key, value]: [1, 32]
...etc...

我尝试了以下各种组合:

options.readableObjectMode = true/false;
options.writableObjectMode = true/false;

也在 _transform() 中使用:

const obj = JSON.parse(chunk.toString());

但是 obj 从来不是一个对象,而是一个字符串。

我的目标是接收一个对象到我的转换流中,改变它,然后输出它。但我在处理字符串时遇到了困难,即使使用 JSON.parse() 也无法将其转换为对象。

我哪里出错了?

更新 - 部分解决方案

问题出在我使用 JSON.parse() 上。我试图解析:

{ car: 'honda', truck: 'mazda' }

这是有效的 JS,但不是有效的 JSON,呃!

但是,更大的问题仍然存在。我已将 Transform 流设置为:writableObjectMode = true,但是当我这样做时:

callback(null, newObj);

我收到错误:

类型错误:无效数据, block 必须是字符串或缓冲区,而不是对象

如果我这样做:

callback(null, JSON.stringify(newObj));

事情按预期进行。

但是,考虑到我已经在对象模式下进行了设置,这不应该在没有字符串化的情况下工作吗?

最佳答案

所以我的代码的主要问题是使用 stdinstdout 。它们是以字符串/缓冲区模式运行的流。按原样使用它们,将 stdin 管道传输到流将以字符串/缓冲区模式而不是对象模式进行管道传输。这同样适用于标准输出。

我通过在对象模式下创建一个可读流来测试我的假设,该流模拟我通过 _read() 输入的 stdin 输入。方法,然后让我的转换流将 block 转换为可读流通过管道传输到其中的对象。

标准输出的管道仍然失败,因为它接受开箱即用的对象。我通过创建另一个转换流来确认这一点,该转换流只是通过 JSON.stringify() 将对象转换为字符串。然后标准输出又高兴了。

我在“读/写对象模式”方面遇到的所有问题都只是因为我的转换流两侧都有标准输入和标准输出。

关于javascript - 如何使用 Node 变换将一个对象转换为另一个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49724711/

相关文章:

javascript - React中如何将一个函数的返回值获取到另一个类中

javascript - 如何在 Firestore JS 中获取现有的文档 key ?

javascript - 在Typescript中将类方法作为参数传递

typescript - 如何指定 TypeScript 匿名内联箭头函数的返回类型

javascript - 如何配置Angular4路由器的路由

javascript - html 显示视频文件二进制缓冲区

javascript - 如何在 Node js的mongoose中查找坐标是否在多边形内

javascript - 为什么这个图像不是垂直镜像的?

javascript - Nodejs中是否有任何像django admin一样工作的模块?

node.js - Meteor 1.3及配置