Одной из проблем является то, что функция Promise.all().then...
ничего не возвращает (и не требует дополнительных resolve()
).Способ отсортировать это - создать небольшие тестируемые функции с обещанием возврата, и проверить их по отдельности .
Начните с простого, напишите тест mocha для подключения к базе данных ...
function connect() {
return oracledb.getConnection({
user: dbconfig.user,
password: dbconfig.password,
connectString: dbconfig.connectString
});
}
Вот тот, который может запустить команду на БД.Проверьте это с помощью простого запроса, который, как вы знаете, вернет некоторые результаты.
function executeCmd(connection, cmd, params) {
return connection.execute(cmd, params, { outFormat: oracledb.OBJECT });
}
Только с этими двумя (и еще одним) мы можем наметить простую функцию, которая выполняет свою работу: подключиться к базе данных, запуститьвыберите, обработайте каждый результат асинхронно, затем отключите.
function connectAndQuery(username) {
let connection;
return connect().then(result => {
connection = result;
let cmd = `select caseid, casereference, startdate from caseheader inner join orgobjectlink on caseheader.ownerorgobjectlinkid = orgobjectlink.orgobjectlinkid where orgobjectlink.username = :username`;
return executeCmd(connection, cmd, [username]);
}).then(result => {
let promises = result.rows.map(row => processCaseRow(connection, row, username));
return Promise.all(promises);
}).then(result => {
// result should be an array of caseObj's
return connection.close().then(() => result);
});
}
Последнее, что нужно создать и протестировать, это функция, возвращающая обещание, которая обрабатывает строку из главной функции, описанной выше.
У меня былочтобы взять на себя некоторую свободу, но я думаю, что цель - учитывая строку, представляющую «case» - создать объект case, включая коллекцию «заинтересованных ролей», которые могут быть запрошены с помощью caseID.(эта последняя часть была моей идеей, но вы можете создать отдельную коллекцию, если хотите)
// return a promise that resolves to an object with the following properties...
// caseID, reference, dateAssigned, username, concernedRoles
// get concernedRoles by querying the db
function processCaseRow(connection, row, username) {
var caseObj = {
caseID: row.CASEID,
reference: row.CASEREFERENCE,
dateAssigned: moment(row.STARTDATE).format('YYYY-MM-DD'),
username: username
}
let cmd = `select concernroleid, concernrolename from concernrole inner join caseparticipantrole on concernrole.concernroleid = caseparticipantrole.participantroleid where caseparticipantrole.caseid = :caseID and (caseparticipantrole.typecode = 'PRI' or caseparticipantrole.typecode = 'MEM')`;
return executeCmd(connection, cmd, row.CASEID).then(result => {
caseObj.concernedRole = result
return caseObj
})
}