Есть ли способ подключить oracledb с помощью класса и модуля typescript ES6?

Я пытаюсь реализовать соединение с оракулом, используя модуль класса Typescript ES6.

Я установил пакет @types/oracledb, а также пакет oracledb. Используется фреймворк Jasmin.

Ниже приведен мой код, который я реализовал.

import * as oracledb from 'oracledb';

export class ConnectionDAO{
/**
 * Connection Variable Declaration
 */
conn;

/**
 * Result Variable Declaration
 */
result;

/**
 *
 * Creates an instance of CommercialDAO.
 * To Initiate Connection and Make the connection utilized by @memberof CommercialDAO
 * @memberof CommercialDAO
 */
constructor() {
   this.conn = oracledb.getConnection({
        user: "commercial",
        password: "oracle",
        connectString: "localhost/COMMERCIALDB"
      }); 
}

public getRwCnt() {
    return new Promise(async function(resolve, reject) {
        try {
            let result = this.conn.execute('SELECT TESTCASEID FROM EXECUTE_TESTCASE');
            resolve(this.result.rows.length);
        } catch (err) { // catches errors in getConnection and the query
          reject(err);
        } 
        this.conn.release();
      });
}
}

Ошибка:

TypeError: this.conn.execute is not a function

Но в этом коде само соединение не сохраняется в переменной this.conn.

есть ли способ избежать обещаний и асинхронной функции? Есть ли другое решение для достижения этого? Пожалуйста, предоставьте вам ценное решение и предложения. Ожидается образец фрагмента.


person Murali    schedule 09.04.2018    source источник


Ответы (3)


Настоящая причина вашей ошибки

TypeError: this.conn.execute is not a function

Это потому, что this.conn, скорее всего, не определен. Добавьте такой чек.

public getRwCnt() {
  if(this.conn === undefined){
    console.log("The connection is not ready yet.");
    return;
... // Rest of your function
}

Но это только подчеркнет, что у вас есть проблема, но не скажет, почему.

Причина в том, что ваш конструктор строго синхронен. Рассмотрите возможность создания функции, которая ожидает завершения конструктора.

Вот версия, которая работает:

import * as OracleDB from 'oracledb';

export class ConnectionDAO {
  /**
   * Connection Variable Declaration
   */
  public conn: OracleDB.IConnection;
  public connProm: OracleDB.IPromise<void>;

  /**
   * Result Variable Declaration
   */
  result;

  /**
   *
   * Creates an instance of CommercialDAO.
   * To Initiate Connection and Make the connection utilized by @memberof CommercialDAO
   * @memberof CommercialDAO
   */
  constructor() {
    this.connProm = OracleDB.getConnection({
      user: "hr",
      password: "hr",
      connectString: "localhost/XEPDB1"
    }).then(async (connection: OracleDB.IConnection) => {
      console.log("Connection finally created in constructor")
      this.conn = connection;
    }).catch((err: any) => {
      console.error(err.message);
    });
    console.log(" - Dumping Connection state in the end of the constructor", {conn: this.conn} , {connProm: this.connProm} );
  }

  public getRwCnt() {
    let me = this;
    return new Promise(async function (resolve, reject) {
      try {
        console.log(" - Dumping Connection state BEFORE waiting",{conn: me.conn} , {connProm: me.connProm} );
        await me.connProm;
        console.log(" - Dumping Connection state AFTER waiting",{connServerVersion: me.conn.oracleServerVersion } , {connProm: me.connProm} );
        let result = await me.conn.execute('SELECT count(*) FROM employees');
        resolve(result.rows);
      } catch (err) { // catches errors in getConnection and the query
        console.log("[Error] happened? - calling reject",err);
        reject(err);
      }
      if(me.conn) // Only release it it if it actually is set
        me.conn.release();
    });
  }
}

const d = new ConnectionDAO();

d.getRwCnt()
  .then((result)=>{console.log("RowCount",result)})
  .catch((err)=>{console.error("Promise rejected - ",err)})

console.log("Object constructor returned");

Запуск этого с помощью ts-node дает этот результат

 - Dumping Connection state in the end of the constructor { conn: undefined } { connProm: Promise { <pending> } }
 - Dumping Connection state BEFORE waiting { conn: undefined } { connProm: Promise { <pending> } }
Object constructor returned
Connection finally created in constructor
 - Dumping Connection state AFTER waiting { connServerVersion: 1804000000 } { connProm: Promise { undefined } }
RowCount [ [ 107 ] ]
person AndreasM_DK    schedule 21.03.2019

Кажется, вы неправильно используете this в функции getRwCnt().

Помните, что каждая функция в JavaScript имеет self this.

Вариант 1 Назначить верхний this другой переменной в начале функции

public getRwCnt() {
    let me = this; 
    return new Promise(async function(resolve, reject) {
        try {
            let result = me.conn.execute('SELECT TESTCASEID FROM EXECUTE_TESTCASE');
            resolve(this.result.rows.length);
        } catch (err) { // catches errors in getConnection and the query
          reject(err);
        } 
        me.conn.release();
      });

Вариант 2. Используйте функцию стрелки ES6.

public getRwCnt() {

        return new Promise(async (resolve, reject) => {
            try {
                let result = this.conn.execute('SELECT TESTCASEID FROM EXECUTE_TESTCASE');
                resolve(this.result.rows.length);
            } catch (err) { // catches errors in getConnection and the query
              reject(err);
            } 
            this.conn.release();
          });
person yong    schedule 10.04.2018

Я попробовал ваше решение, но похоже, что typescript не ждет вызова await me.connectionPromise; Кроме того, не уверен, успешно ли соединение или нет. Я получаю ниже вывода.

Inside constructor
get Connection executed....
 - Dumping Connection state in the end of the constructor { conn: undefined } { connProm: Promise { <pending> } }
Inside getRowNumbers function call....
Connection state BEFORE waiting:  { conn: undefined } { connectionPromise: Promise { <pending> } }
Object constructor returned

Somehow below output lines in your code are missing for me.

Connection finally created in constructor
 - Dumping Connection state AFTER waiting { connServerVersion: 1804000000 } { connProm: Promise { undefined } }
RowCount [ [ 107 ] ]
person Vijay    schedule 16.05.2019