在 MySQL 中使用 Streams 和 Node

Using Streams in MySQL with Node

按照 Piping results with Streams2 上的示例,我正在尝试将结果从 MySQL 流式传输到 node.js 中的标准输出。

代码如下所示:

connection.query('SELECT * FROM table')
      .stream()
      .pipe(process.stdout);

我收到此错误:TypeError: invalid data

说明

从这个 github issue 项目:

.stream() returns stream in "objectMode". You can't pipe it to stdout or network socket because "data" events have rows as payload, not Buffer chunks

修复

您可以使用 csv-stringify 模块解决此问题。

var stringify = require('csv-stringify');

var stringifier = stringify();


connection.query('SELECT * FROM table')
    .stream()
    .pipe(stringifier).pipe(process.stdout);

注意 .pipe(process.stdout)

之前的额外 .pipe(stringifier)

现在有了另一个解决方案,在 Node v10 中引入了 pipeline

管道方法做了几件事:

  1. 允许您通过管道传输任意数量的流。
  2. 完成后提供回调。
  3. 重要的是,它提供了自动清理功能。这比标准 pipe 方法有优势。
const fs = require('fs')
const mysql = require('mysql')
const {pipeline} = require('stream')
const stringify = require('csv-stringify')

const stringifier = stringify()
const output = fs.createWriteStream('query.csv')

const connection = mysql.createConnection(...)

const input = connection.query('SELECT * FROM table').stream()

pipeline(input, stringifier, process.stdout, err => {
  if (err) {
    console.log(err)
  } else {
    console.log('Output complete')
  }
}