use*_*272 5 sql sql-server streaming node.js
我是 node 的新手,正在使用mssql它来连接到 SQL Server。任何人都可以帮助我提供一个更完整的mssql流媒体示例。我发现 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
});
});
Run Code Online (Sandbox Code Playgroud)
我要去神圣的死灵这个帖子,因为我今天遇到了同样的问题,想留下一些可能对我未来有帮助的东西。
根据ExpressJs 文档,流式传输任何大型数据集的正确方法是将write其发送到响应,flush偶尔响应,然后在完成后end响应。
mssql在NPM指出,有你可以订阅,像他们的文档中的摘录列出的几个事件。这很好,但你如何整合两者?
好吧,我想出了以下解决方案(可能不是最好的,但是嘿,它有效)
这个想法是从 SQL 记录中流式传输数据以进行记录,但只将数据以 50 为一组刷新到调用者。完成后,结束响应。
我还需要它恢复Array格式,所以我必须为此构建开头、分隔符和结尾。
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));
rowCount++;
}
request.on('done', ()=> {
res.write(']');
sql.close();
res.end();
};
};
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5126 次 |
| 最近记录: |