Páginas

miércoles, 18 de enero de 2017

Miniservidor con Node.js y oracledb

Hola

En esta entrada vamos a montar un miniservidor html con Node.js que conecte a cierta tabla de Oracle mediante oracledb. Los pasos para instalar todo son:

1) Instalamos node.js y su gestor de paquetes npm

sudo apt-get install nodejs
sudo apt-get install npm

2) Verificamos que está bien instalado con:

nodejs --version                   --> v4.2.6
npm --version                      --> 3.5.2

3) Instalamos algunas de las librerías javascript que vamos a necesitar en nuestro servidor 'miserver.js':

   npm install http
   npm install httpdispatcher

4) Descargamos el 'Oracle Instant Client' de Oracle (http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html) siguiendo las instrucciones de (https://github.com/oracle/node-oracledb). Necesitaremos los packages 'basic' y 'SDK' si la BBDD está en remoto (es lo habitual). Por lo que hemos bajado las versiones de RedHat/linux:

   oracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64.rpm
   oracle-instantclient11.2-devel-11.2.0.4.0-1.x86_64.rpm

5) Para Ubuntu no hay instalador, así que transformamos el instalador rpm (RedHat) con:

   sudo alien -i oracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64.rpm
   sudo alien -i oracle-instantclient11.2-devel-11.2.0.4.0-1.x86_64.rpm

Nota Ubuntu. Tambien hemos necesitado instalar la libreria libaio, no se para qué hace falta

   sudo apt-get install libaio1

6) Seguidamente instalamos la librería javascript oracledb con:

   npm install oracledb

Nota Ubuntu. Para poder lanzar sin problemas la instalacion de oracledb (saltaba un error en 'node-gyp rebuild' descrito en (https://github.com/npm/npm/issues/11335)) he tenido que crear un softlink 'node' dado que se petaba por tener instalado nodejs (el package de ubuntu) en vez del paquete node 'oficial'. Para crear el softlink lanzamos:

   sudo ln -s /usr/bin/nodejs /usr/local/bin/node

8) Creamos nuestro servidor web por el puerto 8888 en javascrip, para ello creamos un fichero llamado 'miserver.js' con el siguiente codigo:


//Importamos las librerias necesarias
var http = require('http');
var HttpDispatcher = require('httpdispatcher');
var oracledb = require('oracledb');

//Inicializamos el enrutador
var enrutador = new HttpDispatcher();

//Definimos la función que manejara las peticiones
function handleRequest(request, response){
        console.log("Peticion:");
        console.log(request.url);
        enrutador.dispatch(request, response);
}

//Creamos el servidor y lo ponemos a escuchar en el puerto 8888
var server = http.createServer(handleRequest);
server.listen(8888, function(){
    console.log("Arrancado y escuchando en el puerto 8888");
});

//Creamos la función que devuelve la pagina /
enrutador.onGet("/", function(req, res) {
  res.writeHead(200, {'Content-Type': 'text/html'});
  res.write("<?xml version='1.0' encoding='UTF-8'?>");
  res.write("<!DOCTYPE html>");
  res.write("<html lang='es' xmlns='http://www.w3.org/1999/xhtml'>");
  res.write("<head>");
  res.write(" <meta http-equiv='Content-type' content='text/html; charset=UTF-8'/>");
  res.write(" <meta name='language' content='es'/>");
  res.write("</head>");
  res.write("<body>");
  res.write("<h3> Primer miniportal con Node.js</h3>");
  res.write(" <ul>");
  res.write("   <li><a href='/listaprovincias'>Lista de provincias</a></li>");
  res.write(" </ul>");
  res.write("</body>");
  res.end();
});

//Creamos la función que devuelve la pagina /listaprovincias
enrutador.onGet("/listaprovincias", function(req, res) {
 
  oracledb.getConnection(
    {
      user          : "user",
      password      : "pwd",
      connectString : "127.0.0.1:1535/prueba"
    },
    function(err, connection) {
        if (err) {
           console.error(err);
           return;
        }
        connection.execute("SELECT CPRO, DPRO FROM PROVINCIAS ORDER BY DPRO",
        function(err, result) {
          if (err) {
             console.error(err.message);
             connection.close();
             return;
          }
          console.log("Encontradas "+result.rows.length+" provincias");

      res.writeHead(200, {'Content-Type': 'text/html'});
      res.write("<?xml version='1.0' encoding='UTF-8'?>");
      res.write("<!DOCTYPE html>");
      res.write("<html lang='es' xmlns='http://www.w3.org/1999/xhtml'>");
      res.write("<head>");
      res.write(" <meta http-equiv='Content-type' content='text/html; charset=UTF-8'/>");
      res.write(" <meta name='language' content='es'/>");
      res.write("</head>");
      res.write("<body>");
      res.write("<h3> Listado de provincias </h3>");
          res.write("<table>");
          res.write("<tr>");
          res.write("<th>CPRO</th>");
          res.write("<th>DPRO</th>");
          res.write("</tr>");
          for (reg in result.rows){
             res.write("<tr>");
             res.write("<th>"+result.rows[reg][0]+"</th>");
             res.write("<th>"+result.rows[reg][1]+"</th>");
             res.write("</tr>");
             console.log(result.rows[reg][0] + "---" + result.rows[reg][1]);
          }
          res.write("</table>");
      res.write("<a href='/'>Volver</a>");
      res.write("</body>");
          res.end();
        });
    });
});


9) Levantamos el servidor con:

node miserver.js

10) Desde el navegador lanzamos la siguiente URL: http://localhost:8888/

Eso es todo