Desarrollo de Servicios RESTful con Node.js y Oracle Database 12c

Por Francisco Riccio
Publicado en Julio 2017


Introducción

Este artículo está enfocado a explicar cómo podemos implementar servicios RESTful a través Node.js manejando datos ubicados en nuestro Oracle Database 12c; para ello definiré algunos términos con la finalidad de luego utilizarlos en el desarrollo de este artículo.

  • Un servicio RESTful es una interfaz que puede interactuar con cualquier dispositivo capaz de comunicarse vía HTTP con la finalidad de obtener o generar operaciones en un repositorio de datos principalmente.
  • Node.js es un lenguaje de programación basado en JavaScript el cual se ejecuta en el lado del Servidor y la programación está orientado a eventos permitiendo generar aplicaciones más livianas y eficientes. Este lenguaje se encuentra construido con el motor de JavaScript de Chrome.
  • Express es un framework opcional que nos ayudará a reducir nuestro código en el manejo de las operaciones de nuestro servidor web que crearemos.
  • BodyParser es una librería que nos permitirá transformar nuestros datos en formato JSON.
  • MethodOverride es una librería que nos dará soporte a las operaciones HTTP.

La implementación se desarrolló en una arquitectura multi-capa separando el Servidor Web con la Base de Datos como a continuación se presenta:

01

Todo el acceso a los datos se realizó utilizando la librería oracledb el cual se explicará más adelante.

Al final de la implementación tendremos 4 servicios RESTful implementados en Node.js que ejecutarán operaciones SQL sobre una tabla de Productos alojados en Oracle Database 12c.

Los 4 servicios que se implementarán son:

  • Listar todos los productos almacenados.
  • Listar el detalle de un producto específico basado en su código.
  • Registrar un nuevo producto.
  • Eliminar un producto de la base de datos.

Implementación

La instalación de Node.js 6.1 es simplemente descargar el instalador para el Sistema Operativo correcto y proceder a instalarlo sin mayor dificultar. El Instalador se encuentra en el siguiente url: https://nodejs.org/en/download/

I. Instalación & Configuración de la Librería oracledb:

La librería oracledb es el driver de conexión a la base de datos Oracle para Node.js. Para instalarlo, el Servidor Web debe cumplir con algunos requisitos los cuales son:

  • Instant Oracle Client (Instant Client Package - Basic + Instant Client Package SDK). Ambos instaladores deben ser descomprimidos en el mismo directorio y la versión mínima a descargar debe ser 11.2.
  • Compilador de C++.
  • Python 2.7.

Adicional se debe crear las siguientes variables de ambiente. En mi caso, el InstantClient lo instalé en el directorio C:\instantclient:

  • OCI_LIB_DIR

    02

  • OCI_INC_DIR

    03

  • PATH (Agregar el directorio InstantClient y Python).

    04


Una vez que se tenga todos los pre-requisitos creados, procedemos a construir nuestra aplicación que permitirá presentar los servicios RESTful.

II. Construcción del Proyecto

1. Creamos un usuario y la tabla PRODUCTO en la base de datos como a continuación se presenta:

05

Una vez creada la tabla procedemos con los demás pasos.

2. Creamos una carpeta en el Servidor Windows, en mi caso la he llamado demo.

3. Luego procedemos a cargar las librerías (Express, BodyParser, MethodOverride y oracledb) al proyecto.

Para realizar este punto, debemos crear un archivo llamado package.json donde declararemos las librerías que deseamos instalar, en este caso quedaría así:

06

Luego ejecutamos el comando npm install y tendremos la siguiente salida:

07

4. Creamos un módulo específico que se encargará de conectar a la base de datos y ejecutar las operaciones SQL que necesitemos que se realicen.

Este módulo lo llamaremos dao.js y utilizará la librería oracledb para realizar dicho fin.

08

Explicación del código:

Línea Explicación
1 Cargamos la librería oracledb y lo referenciamos con la variable objoracle.
3-7 Creamos una variable que almacenará la información de la cadena de conexión de la base de datos Oracle en formato JSON.
9-19 La función error nos permitirá devolver un mensaje de error en formato JSON en caso no se pueda establecer la conexión con la base de datos o cumplir con el requerimiento solicitado por la sentencia SQL.
21 Creamos una función que encapsulará la lógica de conexión a la base de datos, ejecución de la sentencia SQL y finalmente su desconexión.
22-23 Creamos la conexión a la base de datos y de manera asíncrona recibiremos un estado de éxito.
24 En caso de conseguir la conexión con la base de datos, se procede a ejecutar la sentencia SQL requerida. Es importante notar que nuestro código soporta bind variables como parte de la sentencia SQL.

También se ha especificado que toda sentencia DML se ejecutará con AUTOCOMMIT.

Es importante notar que se devolverá el número de registros afectados en caso la sentencia que se desee ejecutar sea una operación DML.
25-32 Se evalúa el éxito de la ejecución de sentencia y en caso de ser exitosa se procede a devolver los datos en formato JSON.
33 Se procede a cerrar la conexión de la base de datos.

La librería oracledb puede ser utilizada desde versiones de Node.js 4 y se encuentra disponible en:

https://github.com/oracle/node-oracledb

En la siguiente url podemos obtener información completa de todas las funciones disponibles por la librería:

https://github.com/oracle/node-oracledb/blob/master/doc/api.md

En ella podemos apreciar que la librería brinda un buen soporte con la base de datos.

Entre sus principales características podemos resaltar las siguientes:

  • Soporte a tipos de datos no básicos: TIMESTAMP, TIMESTAMP_TZ, BLOB, CLOB, RAW.
  • Posibilidad de utilizar Bind Variables: IN, OUT, IN OUT.
  • Manejo de Pool de Conexiones.
  • Posibilidad de utilizar Autenticación Externa.
  • Manejo de transacciones.
  • Sub-Programas (Stored Procedures & Funciones).
  • Soporte a PL/SQL Collection.
  • Globalización.
  • Client Result Cache.
  • Control de FAN (Fast Application Notification).
  • Soporte a JSON (Nuevo tipo de dato en la versión Oracle Database 12.1.0.2 y se integra de manera transparente para la extracción y manejo de datos en este formato).

5. Procedemos a crear el módulo principal que se encargará de crear el Servidor Web y presentar los servicios RESTful. Nuestro módulo se llamará app.js.

09

Explicación del código:

Línea Explicación
1-5 Cargamos las librerías: express, body-parser, method-override y nuestro módulo dao previamente creado.
7-9,
11,46
Enlazamos algunas funciones y variables a nuestra variable app.
13-44 Recibimos el requerimiento enviado por GET y deberá recibirse una variable llamada “opc” cuyo valor debe estar entre 1 a 4.

Si la variable opc tiene el valor de:
  • “1”, se consultará todos los productos registrados.
  • “2”, se solicitará el código del producto e irá como una variable bind variable que se construirá como parte de la sentencia SQL para obtener los datos de un producto específico.
  • “3”, se solicitará el código, nombre, precio unitario y fecha de fabricación de un producto para registrarlo.

    Como parte de la sentencia SQL utilizamos la función TO_DATE para transformar la cadena de texto que se leerá de la url, cuyo formato será DDMMYYYY (día, mes, año).
  • “4”, se solicitará el código del producto para eliminarlo de la base de datos.
48-50 Se iniciará el Servidor Web publicando los servicios por el puerto 3000 tcp/ip.

6. Iniciar el Servidor Web.

node app.js

III. Probar los Servicios RESTful.

1. Probaremos que si no es ingresada la variable opc o su valor no está comprendido entre 1 y 4, se enviará un mensaje indicando que no es una opción válida en formato JSON.

10

11

2. Listamos todos los productos registrados.

Se adjunta la salida del servicio RESTful y el resultado de la consulta en la base de datos.

12

3. Listamos la información de un producto específico.

13

4. Registramos un nuevo Producto.

14

5. Eliminamos el Producto con código 41 de la Base de Datos.

15

Con esta última prueba podemos concluir el trabajo de implementación.

Nuestro Servidor Web en Node.js tendrá la siguiente salida después de ejecutar las pruebas previamente indicadas:

16

Conclusión

Oracle ha desarrollado la librería oracledb que nos permite trabajar de manera transparente desde Node.js toda la comunicación con la base de datos Oracle incluyendo sus nuevas funcionalidades de la versión 12c como por ejemplo: el uso del tipo de dato JSON, dando la posibilidad de crear aplicaciones ligeras, escalables y con mejor desempeño a través de un Oracle Database 12c en este caso.


Ing. Francisco Riccio. Es un Cloud Architect en IBM Perú e instructor de cursos oficiales de certificación Oracle. Está reconocido por Oracle como un Oracle ACE y certificado en productos de Oracle Application & Base de Datos.

Este artículo ha sido revisado por el equipo de productos Oracle y se encuentra en cumplimiento de las normas y prácticas para el uso de los productos Oracle.