1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Readable#pipe の豆知識

Posted at

Node の Stream 周りでちょっと面白い問題に行き当たったので、メモしておきます。

簡略化すると・・・

someStream.once('error', function (err) {
  console.log('You\'ve got an error:', err);
});
someStream.pipe(otherStream);

としていて、someStream.emit('error', err); すると、stream error が throw されるという問題です。

pipe は他にエラーハンドラーが登録されていないと stream error を throw するのですが、once, pipe の順番が直接の原因でした。

原理は以下のような感じです。

  1. once がエラーハンドラーを登録する。
  2. pipe が内部でエラーハンドラーを登録する。
  3. error イベントが emit される。
    1. のエラーハンドラーがまず実行される。
  4. once なので、1. のエラーハンドラーが削除される。
    1. で登録されたエラーハンドラーが他のエラーハンドラーの有無をチェックするが、見つからないので stream error を throw する。

解決するには、以下のどちらかです。

  • once のかわりに on を使う。
  • pipe, once の順番にする。2. 1. 3. 6. 4. 5. の順番で実行され、6. ではまだ 1. のエラーハンドラーが登録されているため stream error が起きません。

Stream2 の ReadableTransform を使っていれば error が複数回 emit されることはないようですが、Stream の実装によっては複数回 emit されるので、on を使っておくのが無難なんですかね。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?