Синхронное NodeJS пакетное задание - PullRequest
0 голосов
/ 05 марта 2020

Я пытаюсь написать пакетный скрипт, который будет

  1. Чтение XML-файлов из каталога
  2. Разбор каждого XML и поиск значения для использования в БД (базе данных) Lookup
  3. Используйте проанализированное значение для поиска дополнительных метаданных в БД
  4. Заполните XML метаданными, полученными из поиска в БД (шаг 4)
  5. Запись обновлена ​​XML для завершения каталог
  6. Закрыть соединение с БД

Проблема, с которой я сталкиваюсь, заключается в том, что я не могу контролировать порядок выполнения кода, чтобы я мог закрыть соединение с БД в конце сценария. Если я пытаюсь закрыть соединение, я получаю ошибку «соединение не определено». Ниже мой код для справки. Есть ли хороший способ сделать sh что-то вроде этого в NodeJs, или я должен смотреть на это на Java или другом языке?

enter code here
'use strict';
let fs = require('fs');
let xml2js = require('xml2js');
const oracledb = require('oracledb');
const dbConfig = require('./dbconfig.js');



function pad(number, length) 
  {

   var str = '' + number;
    while (str.length < length) 
     {
       str = '0' + str;
     }

      return str;
  }

async function run() {



  try {
        // Get a non-pooled connection




       let connection;

        if (!connection) 
         {
           connection = await oracledb.getConnection(dbConfig);
           console.log('Connection was successful!');
         }

         let directory = "EDI_XMLS";
         let dirBuf = Buffer.from(directory);
         //var f = 0;
         let files = fs.readdirSync(directory);
           console.log(files);




         for (let f = 0; f < files.length; f++) 
          {
            let parser = new xml2js.Parser();
            var xml_json_data = "";
            // read the file
            await fs.readFile(directory + "/" + files[f], async function(err, data)             { 
                 // parse the file
                await parser.parseString(data, async function(err, result) {

                let results;

                var line_count = result.page.GLLines[0].GLLine.length;
                console.dir('Invoice: ' + result.page.InvoiceNumber[0]);
                console.dir('Line Total: ' + line_count);
                console.log('File: ' + f);

                try 
                  { // Lookup Data
                      results = await connection.execute('SELECT BUSINESS_UNIT, OPERATING_UNIT, DEPTID,PRODUCT,a.effdt FROM SYSADM.PS_A_NSS_SHPTO_ACC@FDEV a where(a.a_ship_to_customer = :shipTo) order by a.effdt 
                      desc',[pad(result.page.VoucherDescription[0], 10)], {
                        maxRows: 2
                    });
                    console.log(results.metaData);
                    console.log(results.rows);
                  } 
                catch (err) 
                  {
                    console.error(err);
                  }



                 for (let i = 0; i < line_count; i++) // Populate data
                  {
                     result.page.GLLines[0].GLLine[i].GLBU[0] = results.rows[0][0];
                     result.page.GLLines[0].GLLine[i].OpUnit[0] = results.rows[0[1];
                     result.page.GLLines[0].GLLine[i].Department[0] = results.rows[0][2];
                     result.page.GLLines[0].GLLine[i].Product[0] = results.rows[0][3];
                  }

                   // Write to File
                   var builder = new xml2js.Builder();
                   var xml = builder.buildObject(result);
                   await fs.writeFile("complete/" + files[f], xml, function(err, data) {
                    if (err) console.log(err);
                    console.log("successfully written our update xml to file");
                    console.dir('BUs: ' + JSON.stringify(result.page));
                 }); //end write
               }); //end parser
             }); //end readfile
       console.log('End');
      } // async for

     } 
    catch (err)
    {
       console.error(err);
    } 

  finally 
    {
      await connection.close();
      console.log('Finally Done');
    }




 }




run();



console.log('completely Done');
...