Connection is not defined in oracledb

Tags: , , , ,



I am using the oracledb cen node.js module and when making a database connection to make a select, it returns the data but this error also appears:

(node:1) UnhandledPromiseRejectionWarning: ReferenceError: connection is not defined
    at Object.getTest (/home/src/storage/oracleDb.js:29:9)
(node:1) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch().
(rejection id: 1)
(node:1) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

I do the query like this:

 try {
        await oracledb.getConnection(config.db)
        .then(function (conn) {
            return conn.execute(querys.queryTest());
        }, function(err) {
            console.log(err);
        })
        .then(function (result) {
            console.log('Query executed');
            console.log(result.rows[0]);
        }, function(err) {
            console.log(err);
        })
        .catch(function(err) {
            console.log(err);
        });

    } catch (error) {
        console.log(error);
    } finally {
        if (connection) {
            try {
                await connection.close();
            } catch (err) {
                console.error(err);
            }
        }
    }

Answer

If you can use await, then you’re in an async function. If you’re in an async function, why are you using promise chains?

Here’s what this type of code would look like with Promises:

const oracledb = require('oracledb');

function getEmployee(empId) {
  return new Promise(function(resolve, reject) {
    let conn; // Declared here for scoping purposes.

    oracledb
      .getConnection()
      .then(function(c) {
        console.log('Connected to database');

        conn = c;

        return conn.execute(
          `select *
          from employees
          where employee_id = :emp_id`,
          [empId],
          {
            outFormat: oracledb.OBJECT
          }
        );
      })
      .then(
        function(result) {
          console.log('Query executed');

          resolve(result.rows[0]);
        },
        function(err) {
          console.log('Error occurred', err);

          reject(err);
        }
      )
      .then(function() {
        if (conn) {
          // If conn assignment worked, need to close.
          return conn.close();
        }
      })
      .then(function() {
        console.log('Connection closed');
      })
      .catch(function(err) {
        // If error during close, just log.
        console.log('Error closing connection', err);
      });
  });
}

module.exports.getEmployee = getEmployee;

And here’s what it would look like with async/await:

const oracledb = require('oracledb');

function getEmployee(empId) {
  return new Promise(async function(resolve, reject) {
    let conn; // Declared here for scoping purposes.

    try {
      conn = await oracledb.getConnection();

      console.log('Connected to database');

      let result = await conn.execute(
        `select *
        from employees
        where employee_id = :emp_id`,
        [empId],
        {
          outFormat: oracledb.OBJECT
        }
      );

      console.log('Query executed');

      resolve(result.rows[0]);
    } catch (err) {
      console.log('Error occurred', err);

      reject(err);
    } finally {
      // If conn assignment worked, need to close.
      if (conn) {
        try {
          await conn.close();

          console.log('Connection closed');
        } catch (err) {
          console.log('Error closing connection', err);
        }
      }
    }
  });
}

module.exports.getEmployee = getEmployee;

See this series for more info: https://jsao.io/2017/06/how-to-get-use-and-close-a-db-connection-using-various-async-patterns/



Source: stackoverflow