在 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
。
管道方法做了几件事:
- 允许您通过管道传输任意数量的流。
- 完成后提供回调。
- 重要的是,它提供了自动清理功能。这比标准
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')
}
}
按照 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
。
管道方法做了几件事:
- 允许您通过管道传输任意数量的流。
- 完成后提供回调。
- 重要的是,它提供了自动清理功能。这比标准
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')
}
}