所以我尝试使用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 有问题,即使我做了 for() 循环,它也没有完成 sql.connect 并且内部方法“InsertCondition”它触及它,但看起来像那样它会跳过整个 sql.connect block 并继续下一次迭代。
问题: 1.) 我怎样才能正确地使用await来制作GetTenantsInfoByPodKey()、sql.connect和InsertCondition()?等待每个方法先完成然后再进行下一个? [已解决]
2.)当我手动查询它时,它没有反射(reflect)在数据库中,但它返回从 SCOPE_IDENTITY() 插入的键
我怎样才能确保它插入了?就像它首先提交 InsertCondition()
然后提交 InsertTask()
这是我正在尝试的完整应用程序: https://jsfiddle.net/25serz3c/1/
谢谢
最佳答案
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()
关于javascript - 一次等待一个查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55944326/