如何在节点中(正确)链接多个顺序MSSQL查询

时间:2019-08-13 02:06:00

标签: node.js promise node-mssql

我在学习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();

我完全感谢我可能会错误地解决所有问题,因此,任何建议或示例都将不胜感激。

1 个答案:

答案 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