NodeJS me parece que es la herramienta básica para desarrollar Backend por lo simple que es y por todas las librerias que se encuentran disponibles, por lo que ya no hace falta ser un gurú para conectar bases de datos y procesos. Sin embargo, siempre hay que leer bien los RELEASE NOTES donde nos venden las nuevas funciones como lo último y mas innovador del mundo, pero que a veces viene a romper todo tu desarrollo.

Esto sucede con la versión 6 del Node-Oracledb, que introduce el modo Thin, algo realmente bueno, en teoría. Este modo ofrece la posibilidad de conectarse a la base de datos sin depender del ya famoso Oracle Instant Client, y esto puede ser bueno para cuando se trata de plataformas donde aún no se ha publicado una versión oficial del cliente (Macbook corriendo M1/M2 por ejemplo), y por sobre todo: Performance. Pueden revisar este artículo donde se describe las mejoras en rendimiento del modo Thin AQUÍ. Otra mejora importante es que ya no se tiene que depender de la variable UV_THREADPOOL_SIZE, ya que ahora se utiliza un driver nativo de Javascript para la conexión por lo que todo se ejecuta en el thread principal de NodeJS, por lo tanto hay que revisar ese procesador como va en uso, aunque siempre podemos confiar en el modo cluster de PM2 para aprovechar todos los CPUs.

Al grano: Cuando trabajamos con una base en Oracle Cloud, el modo Thin, suena bien pero no funciona “as is” para algunos frameworks como por ejemplo NestJS con integración a TypeORM y la razón es esta:

  • El modo THIN no utiliza las librerias del Oracle Instant Client para conectarse a la base, por lo tanto, no sabe como manejar el Oracle Wallet. Si bien es posible hacerle leer el tnsnames.ora mediante la variable de entorno TNS_ADMIN, IGNORA EL ARCHIVO SQLNET.ORA.

La solución consiste en utilizar unos parámetros nuevos en el comando connect:

  • walletLocation (Ruta al archivo Wallet .pem)
  • walletPassword (Clave que indicamos al descargar el archivo zip en la consola de Oracle Cloud)

Para demostrarlo, tengo un código que me robé de Christopher Jones (Original Aquí)

Modo Thin (Activado por defecto)

const oracledb = require('oracledb');

async function run() {
    //oracledb.initOracleClient();

  const connection = await oracledb.getConnection({
    user: 'usuario',
    password: 'DB_Password',
    connectString: 'tnsname_high',
    walletLocation: '/opt/tnsfolder',
    walletPassword: 'Wallet_Password'
  });

  const result = await connection.execute(`SELECT CURRENT_DATE FROM DUAL`);
  console.dir(result.rows, { depth: null });

  if (connection.thin) {
    console.log('Es thin')
  } else {
    console.log('No es thin')
  }
  await connection.close();
}

run();

Las líneas resaltadas tienen la clave para hacer la conexión. En primer lugar, NO SE DEBE USAR oracledb.initOracleClient() para el modo THIN, y segundo: se debe indicar la ruta del wallet y la clave. Con eso ya estamos con el modo THIN funcionando y tendremos acceso a las mejoras en la comunicación con la base de datos.

Ahora bien, toda mejora tiene un costo y este es que el modo THIN NO TIENE ACCESO A LAS OPCIONES AVANZADAS, especialmente ADVANCED QUEUING. El listado completo de las limitaciones está aquí.

Mi recomendación por ahora sería:

  • Para crear API para manejo de datos, ir por el modo THIN
  • Para acceder a las funciones avanzadas, ir por el modo THICK.
    • NOTA, para lograr esto, hay que llamar al método initOracleClient y el mejor momento es al cargar la configuración desde el environment. Para mostrar esto haré otra publicación con el paso a paso.

Conclusiones:

  • NodeJS es muy fácil de usar, pero hay que leer y tener cuidado con la arquitectura. Y sin querer les he mostrado uno de los mayores problemas de NodeJS, HAY QUE ACTUALIZAR LA APLICACIÓN CONSTANTEMENTE, de lo contrario te puedes quedar con un código que no funciona.
  • Oracle ha hecho un buen trabajo con su política Always Free para que puedas empezar un proyecto sin gastar, y sus conectores son de muy buena calidad, así que aprovecha y comienza a programar gratis en la nube de Oracle Cloud.

Leave a comment

Trending