【问题标题】:Using Streams in MySQL with Node在 MySQL 中与 Node 一起使用 Streams
【发布时间】:2015-05-14 19:52:21
【问题描述】:

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

代码如下:

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

我收到此错误:TypeError: invalid data

【问题讨论】:

    标签: mysql node.js stream


    【解决方案1】:

    现在有了另一个解决方案,在 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')
      }
    }
    

    【讨论】:

      【解决方案2】:

      说明

      来自这个 github issue 的项目:

      .stream() 在“objectMode”中返回流。您不能将其通过管道传输到标准输出或网络 套接字,因为“数据”事件将行作为有效负载,而不是缓冲区块

      修复

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

      【讨论】:

      • 字符串(实际上是缓冲区)和对象模式之间的区别是非常重要的,但往往容易被忽视。很好的收获。
      猜你喜欢
      • 2014-02-13
      • 2011-08-18
      • 1970-01-01
      • 2016-06-21
      • 2021-04-18
      • 1970-01-01
      • 1970-01-01
      • 2019-10-24
      • 2017-07-03
      相关资源
      最近更新 更多