使用管道将数据从 msssql 流式传输到节点

Posted

技术标签:

【中文标题】使用管道将数据从 msssql 流式传输到节点【英文标题】:Use pipe to stream data from msssql to node 【发布时间】:2020-04-10 04:04:49 【问题描述】:

我正在使用节点和node-mssql 6.0.1,我使用流从数据库中获取大量数据并将其发送到前端。

我正在尝试按照docs 的建议使用管道和流,但我无法让它工作。

我的代码是

const pool = new sql.ConnectionPool(config);
const poolConnect = pool.connect();

const testStream = (ws , id) =>      
    poolConnect.then((pool) =>    
      const request = new sql.Request(pool);
      request.pipe(stream);

         request
        .input('id_param', sql.Int, parseInt(id)) 
        .query('SELECT * FROM dataTable WHERE id = @id_param ')  
 ) 

我收到stream is not defined

我的目标是像示例here 一样组合流和管道,然后使用 websockets 将数据发送到客户端。我什至不知道结合流和 websockets 是否有意义。我想不出任何组合或测试的方法

我当前只使用流的工作代码如下所示

const sql = require('mssql');
const pool = new sql.ConnectionPool(config);
const poolConnect = pool.connect();

const testStream = (ws , id) =>        
    poolConnect.then((pool) =>    
      const request = new sql.Request(pool);
      request.stream = true;   
      request
      .input('id_param', sql.Int, parseInt(id))
      .query('SELECT * FROM table WHERE id = @id_param ')  

      let rowsToProcess = [];
      let data = [];  

      request.on('row', row =>    
        rowsToProcess.push(row); 
        if (rowsToProcess.length >= 20)   
          request.pause();
          processRows(false);
         
      );

      request.on('done', () =>       
        processRows(true); 
        sql.close(); 
      );

      const processRows = () =>  
          rowsToProcess.forEach((item)=> 
                data.push(item.name);   
                data.push(item.surname);   
                data.push(item.age);   
            );    
          ws.send(JSON.stringify( success:true, message: data ));
          rowsToProcess = [];
          data = []; 
      //processRows 

    ) //poolConnect.then  

我在这里缺少什么?请帮助我开始使用管道和流,我在 Google 中找不到管道/流示例

谢谢

【问题讨论】:

是的,好吧,stream 没有定义。您要将数据流式传输到吗? @JonasWilms 是的,我发布得太早了。请检查已编辑的问题 如果您在发送之前缓冲所有数据,那么使用流没有多大意义。 【参考方案1】:

简单的可写流

const  Writable  = require('stream');

const stream = new Writable(
  write(chunk, encoding, callback) 
    console.log(chunk.toString());
    callback();    
  
)

【讨论】:

这是很好的第一步。感谢您的代码,但请检查详细的编辑答案 刚刚开始https://nodejs.org/dist/latest-v13.x/docs/api/stream.html

以上是关于使用管道将数据从 msssql 流式传输到节点的主要内容,如果未能解决你的问题,请参考以下文章

将数据从 MySQL 二进制日志流式传输到 Kinesis

将响应正文流式传输到打字稿中的文件:“ReadableStream<Uint8Array>”类型上不存在属性“管道”

将 excel 文件从 MVC 5 控制器流式传输到浏览器

使用 RTSP 从 Opencv 处理后,视频从 PC 流式传输到 Android

谷歌数据流流式传输管道在窗口化后不会将工作负载分配给多个工作人员

通过 RTMP 流式传输 android 相机