Parte 2: Crear una API REST: Conceptos básicos de la base de datos
En el
primer artículo, creó un servidor web, aquí creará un módulo que es responsable de iniciar y
cerrar el grupo de conexiones de
la base de datos utilizando
node-oracledb . Y agregue una función que simplifique la ejecución de declaraciones simples al obtener y liberar automáticamente conexiones del grupo.
Ejecución de grupo de conexiones
Debido a que node-oracledb está construido sobre las bibliotecas de cliente OCI, tiene soporte incorporado para crear grupos OCI que son del lado del cliente y tienen excelentes características de rendimiento. Para crear un grupo de conexiones, comience creando un nuevo archivo de configuración llamado
database.js en el directorio de
configuración . Copie y pegue el siguiente código en el archivo y guarde los cambios.
module.exports = { hrPool: { user: process.env.HR_USER, password: process.env.HR_PASSWORD, connectString: process.env.HR_CONNECTIONSTRING, poolMin: 10, poolMax: 10, poolIncrement: 0 } };
Al igual que con el archivo
config / webserver.js , este archivo le permite establecer algunas propiedades utilizando variables de entorno. El uso de variables de entorno proporciona flexibilidad al implementar la aplicación en diferentes entornos y ayuda a guardar contraseñas y otra información confidencial fuera del código fuente. Ejecute los siguientes comandos desde el terminal para establecer las variables de entorno necesarias y asegúrese de que estén disponibles en futuras sesiones del terminal.
echo "export HR_USER=hr" >> ~/.bashrc echo "export HR_PASSWORD=oracle" >> ~/.bashrc echo "export HR_CONNECTIONSTRING=0.0.0.0/orcl" >> ~/.bashrc source ~/.bashrc
Puede notar que poolMin y poolMax eran iguales y que poolIncrement se estableció en 0. Esto creará un grupo de tamaño fijo que requiere menos recursos de administración, una buena idea para los grupos que obtienen un uso constante.
Aunque Node.js a menudo se describe como "de un solo subproceso", tiene un grupo de subprocesos disponible para ciertas operaciones que de otro modo bloquearían el subproceso principal que ejecuta código JavaScript. Este grupo de subprocesos es utilizado por node-oracledb para realizar todas sus operaciones asincrónicas, como recibir conexiones y ejecutar código SQL y PL / SQL. Sin embargo, el tamaño predeterminado del grupo de subprocesos es 4. Si desea que las 10 conexiones en el grupo funcionen simultáneamente, debe aumentar el número de subprocesos en consecuencia.
La variable de entorno UV_THREADPOOL_SIZE se puede usar para ajustar el tamaño del grupo de subprocesos. UV_THREADPOOL_SIZE se puede configurar antes de ejecutar la aplicación Node.js o desde dentro, pero se debe configurar antes de que se realice la primera llamada utilizando el grupo de subprocesos. Esto se debe al hecho de que el grupo de subprocesos se crea en su primer uso y después de su creación, su tamaño es fijo. Abra el archivo
index.js en la raíz de la aplicación y agregue las siguientes líneas después de la primera línea (que contiene el módulo del servidor web).
Ahora que el grupo de subprocesos tiene el tamaño adecuado, puede ir al módulo de base de datos. Cree un nuevo archivo en el directorio de
servicios denominado
database.js . Copie y pegue el siguiente código y guarde los cambios.
const oracledb = require('oracledb'); const dbConfig = require('../config/database.js'); async function initialize() { const pool = await oracledb.createPool(dbConfig.hrPool); } module.exports.initialize = initialize;
Este módulo primero introduce node-oracledb y el archivo de configuración. Luego, se define una función asincrónica con el nombre initialize, que luego se proporciona a través del objeto module.exports. La función de inicialización crea un grupo de conexiones, que se almacena en la
memoria caché interna de los grupos de conexiones como el grupo predeterminado.
Ahora debe conectar todo para que el grupo de conexiones se inicie antes de que se abra el servidor web. Regrese a
index.js y agregue la siguiente línea debajo de la línea 1.
Luego agregue el siguiente bloque try a la función stratup, inmediatamente antes del bloque try existente que inicia el servidor web.
try { console.log('Initializing database module'); await database.initialize(); } catch (err) { console.error(err); process.exit(1);
En este punto, puede instalar node-oracledb y probar el código. Ejecute los siguientes comandos en una terminal desde el directorio hr_app.
npm install oracledb -s node .
Si ve mensajes de que el módulo de base de datos y el servidor web se están ejecutando, felicidades, ¡su grupo de conexiones ahora está funcionando!
Cerrar el grupo de conexiones
Si cierra la aplicación ahora (usando ctrl + c, como antes), el proceso Node.js se destruirá antes de que se cierre el grupo de conexiones. Aunque todos los procesos de bases de datos relacionados se deben limpiar automáticamente, es mejor cerrar explícitamente el grupo de conexiones antes de salir del proceso Node.js.
Regrese al archivo
services / database.js , agregue las siguientes líneas de código al final y guarde las actualizaciones.
La función de cierre utiliza el método oracledb.getPool () para obtener el grupo predeterminado de forma síncrona, y luego llama al método de cierre en el grupo para cerrarlo.
Para llamar a la función de cierre en el momento adecuado, agregue las siguientes líneas de código al archivo
index.js dentro de la función de apagado inmediatamente después del bloque de prueba existente que detiene el servidor web.
Si inicia y cierra la aplicación nuevamente, verá que el módulo de base de datos se cierra después de cerrar el servidor web, pero antes de que se complete el proceso.
Simplifique las operaciones CRUD simples
Ejecutar código SQL o PL / SQL usando node-oracledb suele ser un proceso de tres pasos: obtener la conexión, ejecutar el código y luego liberar la conexión. Si todo lo que quiere hacer es hacer una llamada para ejecutar (no se requiere una transacción de varios pasos), entonces recibir y liberar la conexión puede parecer un código estándar. Me gusta crear una función que realice las tres operaciones en una sola llamada. Regrese al archivo
services / database.js , agregue el siguiente código a continuación y guarde los cambios.
Normalmente, no utilizará el módulo de base de datos en el módulo del servidor web, sino que lo agregará ahora para verificar que funciona correctamente. Abra el
archivo services / web-server.js y agregue la siguiente línea debajo de las declaraciones constantes existentes en la parte superior.
Luego use el siguiente código para reemplazar todo el controlador app.get que responde con "Hello World!" (Las 3 líneas).
El nuevo controlador utiliza la función simpleExecute del módulo de base de datos para recuperar los valores del usuario actual y la marca de sistema de la base de datos. Los valores se utilizan en el literal de la plantilla para responder al cliente con un mensaje dinámico.
Inicie la aplicación nuevamente y vaya a localhost: 3000. Debería ver algo como la siguiente imagen.

Si ve este mensaje, entonces todo funciona como debería. En el
siguiente artículo, continuará creando la API agregando el enrutamiento, el controlador y la lógica de la base de datos para la solicitud GET.