Как (правильно) связать несколько последовательных запросов MSSQL в Node

Я пишу простой инструмент CLI nodejs, изучая промисы (чтобы избежать ада обратного вызова), и каждый найденный мной пример учебника/stackoverflow показывает только, как сделать один вызов. Мой вариант использования выглядит следующим образом: 1. Подключиться к базе данных (это я могу сделать) 2. Выполнить оператор выбора SQL (также есть эта часть) 3. Проделать некоторые действия с результатами 4. Повторить шаги 2 и 3 еще несколько раз раз

Я собираю имя пользователя и пароль MSSQL (с жестко закодированным сервером «localhost» и именем базы данных «testdb»), поэтому, когда приложение выполняется, я не могу просто подключиться к соединению MSSQL.

Я могу получить это с помощью обратных вызовов, но сейчас у меня около 50 запросов, так что вы можете себе представить безобразие. Полный код ниже дает мне первый запрос, и я сильно подозреваю, что не передаю объект «пул» следующему «тогда», но когда я пытаюсь

.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();

Я полностью понимаю, что могу подходить ко всему этому неправильно, поэтому любые советы или особенно примеры будут очень признательны.


person user1941621    schedule 13.08.2019    source источник


Ответы (1)


Если запросы носят абсолютно последовательный характер, вы можете добиться этого с помощью 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.

person ambianBeing    schedule 13.08.2019
comment
Великолепно! Это именно то, что я искал, спасибо! - person user1941621; 13.08.2019