在带有节点的MySQL中使用流

gudnpqoy  于 2023-01-25  发布在  Mysql
关注(0)|答案(2)|浏览(138)

按照使用Streams2的Piping结果示例,我尝试将结果从MySQL流式传输到node.js中的stdout。
代码如下所示:

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

我得到这个错误:TypeError: invalid data

aelbi1ox

aelbi1ox1#

解释

来自这个项目的github issue
.stream()在"objectMode"中返回流。您无法通过管道将其传输到stdout或网络套接字,因为"data"事件将行作为有效负载,而不是缓冲区块

修复

您可以使用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)

ztyzrc3y

ztyzrc3y2#

随着Node v10中pipeline的引入,现在有了另一种解决方案(查看文档)。
管道方法有几个作用:
1.允许您通过管道传输任意多个流。
1.完成后提供回调。
1.重要的是,它提供了自动清理,这是标准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')
  }
}

相关问题