23. Error Handling

When using Promises or Async/Await, the catch() error object will contain error information when a failure occurs. See API: Errors for information about the properties.

Applications can catch exceptions as needed. For example, when trying to query a table that does not exist:

try {
        const sql = `SELECT * FROM DOESNOTEXIST`;
        result = await connection.execute(sql);
        return result;
} catch (err) {
        console.error(err);
}

If this was in a file called test.js, the displayed error would be like:

Error: ORA-00942: table or view does not exist
    . . .
    at async run (/Users/cjones/test.js:19:5) {
 offset: 14,
 errorNum: 942,
 code: 'ORA-00942'
}

If you are using the callback programming style, the first parameter of the callback is an Error object that contains error information if the call fails. If the call succeeds, then the object is null.

If an invalid value is set for a node-oracledb class attribute, then an error occurs. The same is true for invalid operations on read-only or write-only properties. If an unrecognized property name is used, it will be ignored.

23.1. Connection Identifiers

Some Oracle Network errors contain connection identifiers (CONNECTION_ID) which uniquely identifies a connection in the trace and logs. With the connection identifier, you can correlate diagnostics and resolve connectivity errors. For example:

NJS-501: connection to host dbhost.example.com port 1521 terminated unexpectedly.
(CONNECTION_ID=4VIdFEpcSe3gU+FoRmR0aA==)

See Troubleshooting Oracle Net Services for more information on connection identifiers.

23.2. Increasing the Stack Trace Limit

When you encounter an error in your Node.js application, a stack trace is generated. By default, Node.js displays a total of 10 error frames in the stack trace.

If this stack trace is not enough to show the application’s error line, you can increase the stack trace limit with the Error.stackTraceLimit property, for example:

Error.stackTraceLimit = 50;

const oracledb = require('oracledb');
const mypw = ...  // set mypw to the hr schema password

async function run() {
try {
        connection = await oracledb.getConnection({
        user          : "hr",
        password      : mypw,
        connectString : "localhost/FREEPDB1"
    });
    result = await connection.execute(`SELECT last_name FROM employees`);
    console.log("Result is:", result);
}

23.3. Errors in Thin and Thick Modes

In node-oracledb:

  • The error prefix ORA is used by errors generated in the Oracle Database, and also from the Oracle Call Interface (OCI) libraries used by Thick mode.

  • The error prefix NJS is used by errors generated in the node-oracledb implementation.

  • The error prefix DPI is used by errors generated in the ODPI-C code used by Thick mode.

The Thin and Thick modes of node-oracledb return some errors differently. Some differences are shown in the examples below:

  • Connection messages: The node-oracledb Thin mode connection and networking is handled by Node.js itself. Some errors portable accross operating systems and Node.js versions have NJS-prefixed errors displayed by node-oracledb. Other messages are returned directly from Node.js and may vary accordingly. The traditional Oracle connection errors with prefix “ORA” are not shown. For example, the scenarios detailed below show how the connection and network error messages might differ between the node-oracledb Thin and Thick modes.

    • Scenario 1: The given host does not have a database listener running.

      node-oracledb Thin mode Error:

      NJS-511: connection to listener at host dbhost.example.com port 1521 was refused.
      (CONNECTION_ID=4VIdFEpcSe3gU+FoRmR0aA==)
      Cause: The connection request could not be completed because the database listener
      process is not running.
      

      node-oracledb Thick mode Error may be:

      ORA-12541: TNS:no listener
      
    • Scenario 2: The requested connection alias was not found in the tnsnames.ora file.

      node-oracledb Thin mode Error:

      NJS-517: cannot connect to Oracle Database. Unable to find "sales" in
      "/u01/app/oracle/product/21.3.0/dbhome_1/network/admin/tnsnames.ora"
      

      node-oracledb Thick mode Error may be:

      ORA-12154: TNS:could not resolve the connect identifier specified
      
    • Scenario 3: The Oracle Database listener does not know of the requested service name.

      node-oracledb Thin mode Error:

      NJS-518: cannot connect to Oracle Database. Service
      "sales_service.example.com" is not registered with the listener at
      host dbhost.example.com port 1521. (CONNECTION_ID=4VIdFEpcSe3gU+FoRmR0aA==)
      

      node-oracledb Thick mode Error may be:

      ORA-12514: TNS:listener does not currently know of service requested in
      connect descriptor
      
  • Connection Pooling: The node-oracledb Thin mode pool is not based on the Oracle Call Interface (OCI) Session Pool and has its own NJS messages.

  • Binding: When binding is incorrect, the node-oracledb Thick mode may generate an Oracle Client library error such as:

    ORA-01008: not all variables bound
    

    In contrast, the node-oracledb Thin mode might generate:

    NJS-097: no bind placeholder named ":USER1" was found in the SQL text