在高地流中执行node-mysql查询

时间:2015-10-30 11:35:20

标签: javascript asynchronous stream node-mysql highland.js

我必须从输入文件中抽取行,转换它们并将它们放在输出文件中。

因为输入文件非常庞大,所以我要感谢HighlandJS。

转换步骤包括MySQL DB中的异步查询(通过node-mysql)和 我无法了解如何在流中管理异步查询。我的不同尝试给出了错误或什么都没有。

我的最后一次尝试是:

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

有关如何做到这一点的任何提示?

感谢。

1 个答案:

答案 0 :(得分: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);