我在学习promise(以避免回调地狱)的同时编写了一个简单的nodejs CLI工具,我发现的每个教程/ stackoverflow示例仅显示了如何进行单个调用。我的用例如下: 1.连接到数据库(我可以这样做) 2.执行一条SQL select语句(也有此部分) 3.对结果进行一些处理 4.重复执行步骤2和3几次
我正在收集MSSQL用户名和密码(带有硬编码的服务器“ localhost”和数据库名“ testdb”),因此当应用程序执行时,我不能只是跳入MSSQL连接。
我可以通过回调来实现,但是现在我有大约50个查询,因此您可以想象一下丑陋的地方。下面的完整代码确实使我获得了第一个查询,并且我强烈怀疑我没有将“ pool”对象传递给下一个“ then”,但是当我尝试
时.then((pool,result) => {
//next command
})
它仍然无法识别泳池
这是代码(index.js):
const mssql = require('mssql');
const qry1 = "select fieldA from tblA";
const qry2 = "select fieldB from tblB";
const qry3 = "select fieldC from tblC";
var dbuser = '';
var dbpass = '';
var config = {}
function init() {
log('Beginning Audit');
collectDbInfo(); //The reason I don't just included it all here
}
function collectDbInfo() {
//code is irrelevant to the problem, this is where I'm collecting the database credentials
}
function start() {
config = {
user: dbuser,
password: dbpass,
server: 'localhost',
database: 'testdb'
}
mssql.connect(config)
.then(pool => {
//FIRST query
return pool.request().query(qry1)
})
.then(result => {
processQryA(result);
//SECOND query
return pool.request().query(qry2)
})
.then(result => {
processQryB(result);
//THIRD query
return pool.request().query(qry3)
})
.then(result => {
processQryC(result);
})
mssql.on('error',err => {
log('SQL Error:' err)
mssql.close();
process.exit(0);
}
}
processQryA(data) {
console.log(data.recordset[0].fieldA)
}
processQryB(data) {
console.log(data.rcordset[0].fieldB)
}
processQryC(data) {
console.log(data.recordset[0].fieldC)
}
init();
我完全感谢我可能会错误地解决所有问题,因此,任何建议或示例都将不胜感激。
答案 0 :(得分:0)
如果查询本质上是绝对顺序的,则可以使用async/await
来实现:
async function start(){
config = {
user: dbuser,
password: dbpass,
server: 'localhost',
database: 'testdb'
}
try {
pool = await mssql.connect(config);
const res1 = await pool.request().query(qry1);
processQryA(res1);
const res2 = await pool.request().query(qry2);
processQryB(res2);
const res3 = await pool.request().query(qry3);
processQryC(res3);
const res4 = await pool.request().query(qry4);
processQryD(res4);
/*..And so on with rest of sequential queries*/
/*Any of them resulting in error will be caught in (catch)*/
} catch (error) {
console.error("Error in start()::", error);
}
}
此外:我可能希望将池获取方法与查询执行分开,以很好地处理
errors/validations
。