1

入力ファイルから行を送り出し、変換して出力ファイルに入れる必要があります。

入力ファイルが大きいので、HighlandJS でストリーミングしています。

変換ステップには、(node-mysql を介して) MySQL DB に非同期クエリが含まれており、ストリームで非同期クエリを管理する方法がわかりません。私のさまざまな試行では、エラーが発生するか、何も発生しません。

私の最後の試みはそれです:

h(inputStream)
.split()
.through(JSONStream.parse())
.map(function (data) {
    h.wrapCallback(pool.query(data, function (err, rows) {
        return rows;
    }));
})
.pipe(outputStream);

それを行う方法に関するヒントはありますか?

ありがとう。

4

1 に答える 1

1

簡単な答え: あなたのmap変換は何かを返さなければなりません。現在、何も返されません。

長い答え:

わかりました、この回答の目的のためにロジックを少し単純化します。これが欲しいとしましょう。

input -> map to rows -> output

問題は、指摘したようにマッピングが非同期であり、map関数が何かを返さなければならないことです。この場合、入力の各要素のストリームを返すだけです。というわけでこんな感じ。

// input -> map to a stream of streams of rows -> output
h(input).map(h.wrapCallback(pool.query)).pipe(output);

最後の問題は、ストリームのストリームではなく実際に行を取得することです。flatMapこれは、ストリームのストリームを「通常の」ストリームに「平坦化」する変換を使用して行うことができます。

// input -> map to a stream of rows -> output
h(input).flatMap(h.wrapCallback(pool.query)).pipe(output);
于 2015-10-30T11:53:45.233 に答える