节点SQL Server mssqlstream

我是新来的节点,并与mssql工作,以连接到SQL Server。 任何人都可以帮助给我一个更完整的mssqlstream的例子。 我发现git的例子模糊,不知道从哪里开始。 任何援助将不胜感激。

 var sql = require('mssql'); var config = { user: '...', password: '...', server: 'localhost', // You can use 'localhost\\instance' to connect to named instance database: '...', stream: true, options: {// Use this if you're on Windows Azure } } sql.connect(config, function(err) { var request = new sql.Request(); request.stream = true; // You can set streaming differently for each request request.query('select * from verylargetable'); // or request.execute(procedure); request.on('recordset', function(columns) { // Emitted once for each recordset in a query }); request.on('row', function(row) { // Emitted for each row in a recordset }); request.on('error', function(err) { // May be emitted multiple times }); request.on('done', function(returnValue) { // Always emitted as the last one }); }); 

我要去圣尼克罗这个职位,因为我今天遇到了同样的问题,并希望留下一些可能有助于未来的事情。

根据ExpressJs 文档 ,stream式处理大量数据的正确方法是将其write响应,偶尔flush响应,然后在完成时end响应。

NPM上的 mssql指出可以订阅一些事件,比如你的文档中摘录的内容。 这很好,但你怎么把这两个结合起来呢?

那么,我想出了以下解决scheme(可能是最好的,但嘿,它的工作原理)

这个想法是从SQLlogging数据stream中进行logging,但只是将数据以50批次刷新到调用者。完成后,结束响应。

我也需要它在Array格式,所以我不得不构build开始,分隔符,并为此结束自己。

 exports.listAllRecordsInReallyBigDataTable = (req, res) => { const config = { ... } sql.connect(config, () => { res.setHeader('Cache-Control', 'no-cache'); const request = new sql.Request(); request.stream = true; request.query('select * from myBigTableOrView'); let rowCount = 0; const BATCH_SIZE = 50; request.on('recordset', () => { res.setHeader('Content-Type', 'application/json'); res.write('['); } request.on('row', row => { if (rowCount > 0) res.write(','); if (rows % BATCH_SIZE === 0) res.flush(); res.write(JSON.stringify(row)); rows++; } request.on('done', ()=> { res.write(']'); sql.close(); res.end(); }; }; };