Как связывать асинхронную функцию в обработчике событийJavascript

Форум по Javascript
Ответить
Anonymous
 Как связывать асинхронную функцию в обработчике событий

Сообщение Anonymous »

Я пытаюсь прочитать XML-файл в кусочках с саксофоном и вставить данные в базу данных Oracle с Node-OracledB, но я сталкиваюсь с трудностями с асинхровыми функциями. Вот мой упрощенный код: < /p>

Код: Выделить всё

const { pipeline } = require('stream/promises');
const oracledb = require('oracledb');

let connection;
let sql = [];
let parser;
let rowCount = 0;

async function main() {
const opts = { autoCommit: true, bindDefs: { val: { type: oracledb.STRING, maxSize: 80 } } };
sql.push({ table: 'tab_A', cmd: `INSERT INTO TAB_A (COL) VALUES (:val)`, binds: [], options: opts });
sql.push({ table: 'tab_B', cmd: `INSERT INTO TAB_B (COL) VALUES (:val)`, binds: [], options: opts });

try {
connection = await oracledb.getConnection({ user: 'user', password: 'secret', connectString: 'DB01' });
await parse("my-file.xml");
console.log(`Inserted ${rowCount} rows`);
} catch (err) {
console.error(err.stack);
} finally {
console.log(`Close connection`);
if (connection)
await connection.close();
}
console.log(`File imported`);
}

function createParser(handler, options = {}) {
const sax = require('sax');
const stream = sax.createStream(true);
stream.on("closetag", onClose.bind(null, handler, options));
return stream;
}

function onClose(handler, options, name) {
handler(name);
}

async function parse(file) {
const fs = require('fs');
parser = createParser(processTag)
const reader = fs.createReadStream(file);
await pipeline(reader, parser);
console.log(`File parsed`);
}

async function processTag(tag) {
if (tag == 'NE') {
// read one chunk, insert into DB
for (let item of sql) {
try {
const result = await connection.executeMany(item.cmd, item.binds, item.options);
rowCount += result.rowsAffected;
} catch (error) {
console.error(error);
}
}
sql.find(x => x.table == 'tab_A').binds = [];
sql.find(x => x.table == 'tab_B').binds = [];
} else if (tag == 'moi') {
sql.find(x => x.table == 'tab_A').binds.push({ val: 'some stuff from XML file' });
sql.find(x => x.table == 'tab_B').binds.push({ val: 'some other stuff from XML file' });
}
}

main();
< /code>
Я не управлял им, чтобы полностью воспроизводить мою проблему, однако я не думаю, что это имеет значение в этом случае. < /p>
Код выше работает более или менее, однако программа работает и заканчивается без печати, файл, такие как «Вставленные $ {rowcount}», «Pilemed», File Parsed », etc. XML-TWIG, если вы хотите видеть более подробную информацию), первая часть вставлена, а затем я получаю ошибку < /p>
Parsing done
Inserted 0 rows
Close connection
File imported
Error: NJS-003: invalid or closed connection
at throwErr (C:\Developing\Source\MCMS\Server\ansible\files\node_modules\oracledb\lib\errors.js:742:10)
at Object.assert (C:\Developing\Source\MCMS\Server\ansible\files\node_modules\oracledb\lib\errors.js:592:5)
at Connection.executeMany (C:\Developing\Source\MCMS\Server\ansible\files\node_modules\oracledb\lib\connection.js:1045:12)
at async Connection.executeMany (C:\Developing\Source\MCMS\Server\ansible\files\node_modules\oracledb\lib\util.js:271:16)
at async Object.neHandler [as function] (C:\Developing\Source\MCMS\Server\ansible\files\node\Huawei_NBI.js:95:28) {
code: 'NJS-003'
}
Я бы предположил, что, запустив, await parse ("my-file.xml"); оно не должно закрывать соединение до того, как XML-файл будет полностью проанализирован и вставлен.

Подробнее здесь: https://stackoverflow.com/questions/794 ... nt-handler
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Javascript»