14

Node v10.11 では、オブジェクトをパイプにプッシュしようとしていますが、常にエラーが発生します。

events.js:72
    throw er; // Unhandled 'error' event
          ^
TypeError: Invalid non-string/buffer chunk
    at validChunk (_stream_writable.js:150:14)
    at WriteStream.Writable.write (_stream_writable.js:179:12)

私はできる

this.push(chunk)

データを直接パイプしますが、できません

var result = {'the web content is': chunk}
this.push(result)

30 LOC で実行可能な例:

var stream = require('stream');

var MsgExtractStream = function() {
  stream.Transform.call(this,{objectMode: true});
}

MsgExtractStream.prototype = Object.create(
  stream.Transform.prototype, {constructor: {value: MsgExtractStream}} )

MsgExtractStream.prototype._transform = function(chunk, encoding, callback) {
  var result = {'the website is': chunk};
  this.push(result);
}

MsgExtractStream.prototype.write = function () {
  this._transform.apply(this, arguments);
};

MsgExtractStream.prototype.end = function () {
  this._transform.apply(this, arguments);
  this.emit("end");
};

var fs = require("fs"),
  inPage = fs.createReadStream("inPage.html"),
  outPage = fs.createWriteStream("outPage.html"),
  msgPage = new MsgExtractStream();

inPage.
pipe(msgPage).
pipe(outPage);
4

1 に答える 1

9

最後のステートメントを除いて、あなたがしていることはすべて正しいです。MsgExtractStream の結果を単純なTransformストリームにパイプobjectModeしています。

パイプすると、msgPage から内容を読み取り、オブジェクトを取得して outPage に書き込みます。ただし、outPage には on がないobjectModeため、strings/buffer が必要であり、書き込み時にエラーがスローされます。

パイプの 1 つだけを実行してみてください。うまくいきます。

編集

それがエラーをデバッグする私の方法でした.1本のパイプはエラーを引き起こしません. まず、次のようなデータの流れを確認します。

string stream -> object stream -> string stream
             string          object

MsgExtractStream で取得するチャンクは、inPage からの文字列です。文字列だけでなく、どんなオブジェクトでもOKです。変換では、オブジェクトにラップされたチャンクを出力に書き込みます。文字列を取得し、オブジェクトを書き込みます。

現在、2 つのオプションがあります。問題を解決するには、次のパイプが機能するように、次のパイプが機能MsgExtractStreamするように、文字列を返す必要がありますthis.push(chunk)

または、オブジェクト ストリームが必要な場合は、から取得しMsgExtractStreamます。次のような別のパイプが必要になります。

string stream -> object stream -> object stream -> string stream
            string           object           string

最初のオブジェクト ストリームは文字列からオブジェクトを作成し、2 番目はオブジェクトから文字列を作成します。パイプするように、チェーンに沿ってオブジェクトのタイプを処理する必要があります。

于 2013-07-25T06:04:21.943 に答える