Tengo Express Routing configurado con varias rutas, cada una con una conexión de Oracle diferente. Tengo que llamar a initOracleClient antes de getConnection; sin embargo, recibo un error (Error: NJS-077: la biblioteca Oracle Client ya se ha inicializado) cuando intento iniciar Oracle Client en ambas rutas. Intenté mover initOracleClient a diferentes ubicaciones en la estructura; tanto a nivel de aplicación como a nivel de ruta. ¿En qué parte de una estructura REST MVC inicializa el cliente?
Una aplicación REST MVC normalmente tiene alguna infraestructura de apoyo. Es decir, MVC no es un modelo completo sobre cómo estructurar la totalidad del código de su programa, solo una regla general sobre cómo asignar ciertas responsabilidades.
La biblioteca que está utilizando necesita inicialización y, aparentemente, este código debería ejecutarse solo una vez. Hay varias formas de hacerlo:
.listen()
, por lo que el tiempo hasta que su aplicación comience a responder a HTTP puede ser más largo..then()
en la misma Promesa.Implementé el patrón Singleton como se sugiere:
import oracledb from 'oracledb'; class PrivateOraInitSingleton { constructor() { try { oracledb.initOracleClient({libDir: '/usr/local/lib/instantclient_19_8'}); } catch (err) { console.error(err); process.exit(1); } } } class OraInitSingleton { constructor() { throw new Error('Use OraInitSingleton.getInstance()'); } static getInstance() { if (!OraInitSingleton.instance) { OraInitSingleton.instance = new PrivateOraInitSingleton(); } return OraInitSingleton.instance; } } export default OraInitSingleton;
Uso:
const object = OraInitSingleton.getInstance(); try { connectionPromise = oracledb.getConnection({ user : process.env.DB_USER, password : process.env.DB_PASSWORD, connectString : process.env.CONNECT_STRING }); } catch (err) { console.error(err); process.exit(1); }