Итак, я пытаюсь создать последовательную цепочку вставки в базу данных, используя nodejs и mssql. Вот краткий обзор:
- Вставить в таблицу условий
- Вставить в таблицу задач
и т. Д. *
Вот мой код:
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 ()
Как я могу убедиться, что он вставляет? как будто он фиксирует сначала InsertCondition()
, а затем фиксирует следующий метод внутри InsertTask()
Вот полное приложение, которое я пытаюсь:
https://jsfiddle.net/25serz3c/1/
Спасибо