首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Node.js:为什么转换流的转换函数从未被调用过?

Node.js:为什么转换流的转换函数从未被调用过?
EN

Stack Overflow用户
提问于 2020-02-03 04:54:35
回答 1查看 872关注 0票数 0

我试图在Node.js 12中编写一个自定义转换器流,具体来说,我在流(数据库驱动程序)中接受json对象,并返回一个转换过的对象。但我的变压器功能从来没有被调用过。我也尝试过重写streams.Transform类。

为了传递泛型函数,我希望使自定义转换成为通用的,因此我将它封装在闭包中:

代码语言:javascript
复制
// transformStream.js
var through2, transformStream;

through2 = require('through2');

transformStream = (handler) => {
  // Through2 in Object Mode
  _transformStream = through2.obj((data, encoding, callback) => {
    console.log(data); // Never called
    this.push(handler(data));
    return callback();
    // also tried:
    // return callback(null, handler(data));
  });

  return _transformStream;
};

module.exports = transformStream;

下面是试车台:

代码语言:javascript
复制
// transformStream.test.js
var jsonStream, through2, transformFunc, transformStream, transformer;

through2 = require('through2');
transformStream = require('./transformStream.js');

// Convert back to a string buffer for console output.
jsonStream = through2.obj(function(chunk, encoding, callback) {
  return callback(null, JSON.stringify(chunk, null, 2) + '\n');
});

transformFunc = function(data) {
  console.log("called with data", data); // Never called!
  data.c = data.a * data.b;
  return data;
};

// deviceStream.pipe(process.stdout)
transformer = transformStream(transformFunc);

transformer.on("error", function(error) {
  return console.error(`Error in Transform: ${error.message}`);
});

transformer.pipe(jsonStream).pipe(process.stdout);

transformer.push({
  a: 1,
  b: 2
});

该流似乎正常工作,从不调用实际的转换代码,并且始终只返回原始的json:

代码语言:javascript
复制
{
  A: 1,
  b: 2
}

在控制台里。

我希望看到:{ a: 1, b:2, c:2 }

编辑:我还有另一个使用类的版本(绕过through2),同样的问题是:

代码语言:javascript
复制
module.exports = TransformStream = class TransformStream extends Transform {
  constructor(handler, {debug, highWaterMark, ...options}) {
    super({
      highWaterMark: highWaterMark || 10,
      autoDestroy: true,
      emitClose: true,
      objectMode: true,
      debug: true
    });
    this._transform = this._transform.bind(this);
    this.handler = handler;
    this.debug = debug;
    this.options = options;
  }
};

TransformStream.prototype._transform = (data, encoding, callback) => {
  if (this.debug) {
    console.log(data);
  }
  return callback(null, this.handler(data));
};
EN

回答 1

Stack Overflow用户

发布于 2020-02-03 07:40:39

显然,执行TransformClass.push调用流的内部输出缓冲区。流实际上需要一个.write({})方法,并适当地调用_transform函数。

在试验台上,最终测试应是:

代码语言:javascript
复制
transformer.write({
  a: 1,
  b: 2
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60033281

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档