0

Node.js 12 でカスタム トランスフォーマー ストリームを作成しようとしています。具体的には、ストリーム (データベース ドライバー) で json オブジェクトを取り込み、変換されたオブジェクトを返します。しかし、私のトランスフォーマー関数は決して呼び出されません。また、streams.Transform クラスをオーバーライドしてこれを試しました。

カスタム変換をジェネリックにしたいので、ジェネリック関数を渡すためにクロージャーで囲みます。

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

これを試すためのテスト リグは次のとおりです。

// 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 のみを返します。

{
  A: 1,
  b: 2
}

コンソールで。

私は見ることを期待しています: { a: 1, b:2, c:2 }

EDIT:クラスを使用する別のバージョンもあり(through2をバイパス)、まったく同じ問題があります:

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

1 に答える 1

0

どうやら a を実行するTransformClass.pushと、ストリームの内部出力バッファーが呼び出されます。ストリームは実際には.write({})メソッドを予期しており、_transform 関数を適切に呼び出します。

テスト リグでは、最終テストは次のようになります。

transformer.write({
  a: 1,
  b: 2
});
于 2020-02-03T07:40:39.983 に答える