我是节点新手,正在使用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
});
});
答案 0 :(得分:4)
我要去 Holy Necro 这篇文章,因为我今天遇到了同样的问题,并希望留下一些可能对未来有帮助的东西。
根据ExpressJs
documentation,流式传输任何大型数据的正确方法是write
偶然发送响应,flush
响应,然后完成,end
回复。
mssql
声明您可以订阅一些活动,例如您的文档摘录中列出的活动。这很棒,但你如何整合这两个?
好吧,我提出了以下解决方案(可能不是最好的,但是嘿,它有效)
我们的想法是从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();
};
};
};
答案 1 :(得分:0)
无需任何记录集考虑的正确方法是
let request = new sql.Request();
request.stream = true;
request.query(*query*);
request.on('row', row => {
// Emitted for each row in a recordset
})
request.on('error', err => {
console.log(err);
// May be emitted multiple times
})
request.on('done', result => {
console.log("done ", result);
// Always emitted as the last one
})