3

ストリームを介して画像ファイルのようなものをパイプするときに、それと一緒にメタ オブジェクトを送信する方法はありますか?

私のサーバーは、ユーザーから画像を送信されます。イメージは、さまざまなアクションを実行する一連のストリームを通じてプッシュされます。

最後のストリームはdataイベントを発行し、結果の画像バッファーをコールバックに渡しますが、ユーザーのすべてのコンテキストを失います。結果の画像をユーザーのIDやその他のメタデータに関連付けておく必要があります。

理想:

stream.on('data', function(img, meta){
   ...
})

可能な解決策をありがとう!

4

3 に答える 3

5

つまり、Node.js には、ストリームにメタデータを含めることをサポートするものは何も組み込まれていません。ただし、次のような他のオプションがあります。

  1. クロージャを使用して、ストリームとは別にメタデータを追跡できます。例えば:

    function handleImage(imageStream) {
      var meta = {...};
      imageStream.pipe(otherStreams).on('data', function(image) {
         // you now have `image` and `meta` variables at your disposal here.
      }
    }
    

    これの欠点は、メタデータが で利用できないことですotherStreams

    これは、他のストリームがサードパーティ コードであり、制御できない場合、またはメタデータについて知る必要がない場合に適したソリューションです。

  2. 特定のポイントまでのすべてのデータがメタデータであり、それ以降のすべてが画像である HTTP ヘッダーと同様のことを行うことができます。(HTTP では、デリミネータは\n\n最初に発生する場所にあります。) チェーン内のすべてのストリームは、これを認識して処理する必要があります。

    メタデータが常に 1 つのチャンクにあり、ストリームのいずれもチャンクを分割またはマージしないことがわかっている場合は、これを少し単純化して、最初 (または最後) のチャンクが常にメタデータであると言うことができます。

  3. 彼の回答で言及されている Amoli のようなオブジェクト ストリームに切り替えます。ここではパスし{image: imgData, meta: {...}}ます。次に、この形式を期待するように他のストリームを更新する必要があります。

    ただし、この方法の主な欠点は、メタデータを複数回渡すか、それを必要とするストリームごとにどこかにキャッシュするか、画像全体を 1 つのチャンクとして渡す必要があることです (これは、「ストリームのポイント全体を殺すようなものです)」 」)。そして、私が聞いたところによると、node.js はオブジェクト ストリームよりもテキスト/バイナリ ストリームを最適化できます。したがって、これはおそらくあなたの状況には適したアプローチではありません。

  4. ここではhttps://github.com/dominictarr/mux-demuxが役立つかもしれません。複数のストリームを 1 つに結合するため、個別の画像ストリームとメタ ストリームを使用できます。ただし、それがあなたの状況にどれだけうまくいくかはわかりません。それを認識するために、おそらくすべてのストリームを更新する必要があります。

最初のオプション以外はすべて他のストリームを変更する必要があると言ったことは知っていますが、それを回避する方法があります。画像とメタデータを分割し、画像データのみをメインに渡す汎用の「ストリームラッパー」を作成できますストリームし、メタデータがそれをバイパスして、チェーンの次のメタデータに進みます。ただし、これはすぐに醜くなるので、おそらく最良のアイデアではありません。

于 2013-09-19T16:48:23.703 に答える
0

metastreamこのタイプのものと呼ばれるモジュールを作成しました。(npmにあります)。

于 2015-02-07T02:00:37.443 に答える