жду одного запроса за раз - PullRequest
0 голосов
/ 02 мая 2019

Итак, я пытаюсь создать последовательную цепочку вставки в базу данных, используя nodejs и mssql. Вот краткий обзор:

  1. Вставить в таблицу условий
  2. Вставить в таблицу задач

и т. Д. *

Вот мой код:

    var PODKEY = process.env.PODKEY;
var ADDBY = process.env.ADDBY;
var dateTimeNow = new Date(Date.now()).toISOString().replace(/Z$/, "");

(async function () {
    try {
        DecryptConnectionString(connectionString, 'ProductIpsMasterConnectionString')
            .then(async function () {
                let connectionConfigurationObject = await BuildConnectionConfigurationObject(connectionString);
                await sql.connect(connectionConfigurationObject).then(async function () {
                    GetTenantsInfoByPodKey(PODKEY).then(async function (resultTenantsInfo) {
                        resultTenantsInfo.forEach(async function (tenant) {
                            var transaction = new sql.Transaction();
                            await transaction.begin(async function () {

                                let tenantConnectionConfigurationObject = await BuildConnectionConfigurationObject(tenant.CONNECTIONSTRING);

                                await sql.connect(tenantConnectionConfigurationObject).then(async function () {
                                    console.dir("Connected to Tenant ID: " + tenant.TENANTID);
                                    await InsertCondition(transaction).then(async function (resultCondition) {
                                        console.log("Successfully Inserted, Condition Key: " + resultCondition[0].conditionKey);
                                        await InsertTask(transaction, resultCondition[0].conditionKey).then(async function (resultTask) {
                                            console.log("Successfully Inserted, TaskKey: " + resultTask[0].taskKey);
                                            transaction.commit();
                                        });

                                    }).catch(function (err) {
                                        console.error("Error Inserting Condition: " + err);
                                    });
                                }).catch(function (err) {
                                    console.error("Error connecting to Tenant DB: " + err);
                                });

                            });
                        });
                    }).catch(function (err) {
                        console.error("Error getting Tenants Info: " + err);
                    });
                }).catch(function (err) {
                    console.log('error connecting to Master DB:' + err);
                });
                console.dir("Connected Successfully to Master DB!");
            }).catch(function (err) {
                console.log('error decrypting connection string :' + err);
            });

    } catch (err) {
        console.error("Error Occured: " + err);
    }
})()

function GetTenantsInfoByPodKey(transaction, podKey) {
    return new Promise(function (resolve, reject) {
    new sql.Request(transaction).query(query).then(function (recordset) {
        resolve(recordset)});
    });
}

function InsertCondition(connectionObject, transaction) {
    return new Promise(function (resolve, reject) {
       var query = "insert into table(col1,col2..) values (val1,val2,..);select SCOPE_IDENTITY() AS conditionKey;"
       new sql.Request()
               .query(query, (err, recordset) => {
                resolve(recordset);
                });
     });
}

 function InsertTask(connectionObject, transaction) {
    return new Promise(function (resolve, reject) {
       var query = "insert into table(col1,col2..) values 
   (val1,val2,..);select SCOPE_IDENTITY() AS taskKey;"
       new sql.Request()
               .query(query, (err, recordset) => {
                resolve(recordset);
                });
     });
}

Предполагается, что запросы работают нормально и вставляются, но у меня есть проблема с forEach, даже если я сделал это для цикла (), он не завершает sql.connect, а внутри метода "InsertCondition" он касается этого, но выглядит так он пропускает весь блок sql.connect и переходит к следующей итерации.

Вопрос: 1.) Как сделать, чтобы GetTenantsInfoByPodKey (), sql.connect и InsertCondition () ожидали правильно? ждете, когда каждый из этих методов закончится первым, прежде чем переходить к следующему? [Решено]

2.) Он не отражается в БД, когда я запрашиваю его вручную, однако возвращает ключ, вставленный из SCOPE_IDENTITY () Insert and committ Как я могу убедиться, что он вставляет? как будто он фиксирует сначала InsertCondition(), а затем фиксирует следующий метод внутри InsertTask()

Вот полное приложение, которое я пытаюсь: https://jsfiddle.net/25serz3c/1/

Спасибо

1 Ответ

1 голос
/ 02 мая 2019
async function f () {

    for(const tenant of resultTenantsInfo) {
      const connectionObjTenant = BuildConnectionConfigurationObject(tenant.CONNECTIONSTRING);
      await sql.connect(connectionObjTenant);
      const transaction = new sql.Transaction();
      awai transaction.begin()
      const resultCondition = await InsertCondition(transaction)
      console.log("Inserting Condition was successfull. Condition Key: " + resultCondition[0].conditionKey);
      await transaction.commit();
      console.dir("Transaction commited.");
    }
}

f()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...