Я пытаюсь прочитать 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-файл будет полностью проанализирован и вставлен.
Я пытаюсь прочитать XML-файл в кусочках с саксофоном и вставить данные в базу данных Oracle с Node-OracledB, но я сталкиваюсь с трудностями с асинхровыми функциями. Вот мой упрощенный код: < /p> [code]const { pipeline } = require('stream/promises'); const oracledb = require('oracledb');
let connection; let sql = []; let parser; let rowCount = 0;
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' } [/code] Я бы предположил, что, запустив, await parse ("my-file.xml"); оно не должно закрывать соединение до того, как XML-файл будет полностью проанализирован и вставлен.