Самая очевидная проблема - это время, когда вы выполняете обещание, которое слишком рано.Вы вызываете resolve
вне вызова на oracledb.getConnection
.У вас еще нет соединения, вы еще не выполнили запрос и еще не собрали строки.Сначала вы должны сделать все это, а затем вызвать resolve
и передать данные.
Это одна из самых сложных вещей, когда вы начинаете работать с Node.js.Посмотрите это видео, оно может помочь:Большинство разработчиков Node.js начинают с обратных вызовов, а затем переходят к альтернативным шаблонам для асинхронной работы: https://jsao.io/2017/06/how-to-get-use-and-close-a-db-connection-using-various-async-patterns/
Наконец, вот пример того, как можно выполнить итерацию набора результатов с помощью async / await:
const oracledb = require('oracledb');
const config = require('./dbConfig.js');
async function runTest() {
let conn;
let result;
try {
conn = await oracledb.getConnection(config);
result = await conn.execute(
'select * from all_objects where rownum < 100',
[],
{
resultSet: true
}
);
let row;
while (row = await result.resultSet.getRow()) {
console.log(row);
}
} catch (err) {
console.error(err);
} finally {
if (result && result.resultSet) {
try {
await result.resultSet.close();
} catch (err) {
console.error(err);
}
}
if (conn) {
try {
await conn.close();
} catch (err) {
console.error(err);
}
}
}
}
runTest();
В зависимости от рабочей нагрузки, может быть лучше получить больше строк одновременно с getRows
:
const oracledb = require('oracledb');
const config = require('./dbConfig.js');
async function runTest() {
let conn;
let result;
try {
conn = await oracledb.getConnection(config);
result = await conn.execute(
'select * from all_objects where rownum < 100',
[],
{
resultSet: true
}
);
let rows = await result.resultSet.getRows(50);
while (rows.length) {
for (let x = 0; x < rows.length; x += 1) {
console.log(rows[x]);
}
rows = await result.resultSet.getRows(50);
}
} catch (err) {
console.error(err);
} finally {
if (result && result.resultSet) {
try {
await result.resultSet.close();
} catch (err) {
console.error(err);
}
}
if (conn) {
try {
await conn.close();
} catch (err) {
console.error(err);
}
}
}
}
runTest();