2

Diseñando APIs RESTful con RethinkDB, NodeJS & Express.js

1978Puntos

hace 6 años

RethinkDB es un motor de base de datos por lo que necesitamos conectarlo a nuestro backend. En este artículo aprenderemos cómo conectar NodeJS con RethinkDB, un stack interesante para aplicaciones modernas. El primer paso es instalar y levantar un servidor de RethinkDB, si usas Windows no te preocupes, tenemos un artículo que te explica como hacerlo. Una vez tengamos el servidor corriendo, vamos a la carpeta de nuestro proyecto e instalamos el cliente de RethinkDB para NodeJS.

npm install rethinkdb


Ahora creamos un archivo que en este ejemplo llamaremos nodeServer.js, pero tu puedes llamarlo como prefieras, allí guardaremos el código que queremos ejecutar en NodeJS. Lo primero que tenemos que hacer es importar RethinkDB como una dependencia, se recomienda asignarlo a una variable de esta forma:

var r = require(‘rethinkdb’); 

Lo siguiente es hacer una conexión con nuestra base de datos, para esto usamos los siguientes parámetros, de los cuales el host y el puerto son obligatorios:

  • host : es en donde tenemos nuestro servidor de RethinkDB, en desarrollo suele ser localhost o la IP de una máquina virtual.
  • port : el puerto en donde se encuentra la conexión, por default es 28015.
  • db : aquí indicamos la base de datos que vamos a usar para esta conexión.
  • authkey : una clave de autenticación que nos permite proteger nuestra base de datos.
  • timeout : el tiempo en segundos que la conexión permanecerá abierta.

Recomendamos guardar estos parámetros en JSON, para facilitar su manejo lo guardaremos en un archivo como este:

config.json
{
    "rethinkdb": {
        "host": "192.168.1.6",
        "port": 28015,
        "authKey": "",
        "db": "test"
    }
}

Hacer una conexión entre NodeJS y RethinkDB es relativamente fácil, el código a continuación nos muestra cómo establecer una conexión:

nodeServer.js
var config                = require('./config.json');
var r                    = require('rethinkdb');
r.connect(config.rethinkdb)
.then(function(conn) {
    console.log(conn);
})
.error(function(error){
    console.log(error.message);
});

Si ejecutamos el código anterior en NodeJS, en la consola se mostrarán los detalles de la conexión, en esta imagen puedes ver algunos de los que se muestran: Para poder generar una API RESTful con esa conexión, vamos a usar un framework de NodeJS llamado Express, así que empecemos por instalarlo desde nuestra consola.

npm install express

Para armar nuestra API, empecemos importando las configuraciones y cargando las dependencias en nodeserver.js.

nodeServer.js
var config                = require('./config.json');
var express                = require('express');
var serveStatic            = require('serve-static');
var bodyParser            = require('body-parser');
var multer                = require('multer')
var r                    = require('rethinkdb');

Para este proyecto vamos a usar las siguientes dependencias, te invitamos a revisar su documentación:

Para empezar necesitamos revisar que la base de datos está lista e iniciar los elementos en la base de datos en caso de que estos falten, seguimos los siguientes pasos:

  1. Crear una base de datos con dbCreate().
  2. Crear una tabla con tableCreate().
  3. Crear un index con indexCreate().
  4. Esperar a que se registre el index.
  5. Iniciar Express.

Empecemos por iniciar variables para guardar el nombre de la tabla y otra para el index que vamos a usar en RethinkDB

nodeServer.js
var table                = 'list';
var tableIndex            = 'createdAt';

Ahora creemos una función a la que vamos a llamar para iniciar Express y su configuración la vamos a guardar en config.json.

config.json
{
    "rethinkdb": {
        "host": "192.168.1.6",
        "port": 28015,
        "authKey": "",
        "db": "test"
    },
    "express": {
        "port": 80
    }
}

nodeServer.js
var startExpress        = function(){
    app.listen(config.express.port);
}

Lo siguiente que vamos a hacer es definir la función que se va a encargar de inicializar la base de datos y Express.

nodeServer.js
var initialize             = function(conn) {
    r.table(table).indexWait('createdAt').run(conn)
    .then(startExpress())
    .error(function(error){
        r.tableCreate(table).run(conn)
        .finally(function(){
            r.table(table).indexCreate(tableIndex).run(conn)
            .finally(startExpress());
        });
    });    
};

Es importante señalar que estamos usando promesas, por lo que es indispensable notar lo siguiente:

  • .then( ) se llama cuando se completa la transacción de forma exitosa.
  • .error( ) se llama cuando se genera un error en la transacción.
  • .finally( ) se llama independientemente de si la transacción fue exitosa o no, de haber .then( ) o .error( ) estos se ejecutarán primero.

Ahora es momento de conectarnos a nuestra base de datos, una vez realizada la conexión con RethinkDB, debemos asegurarnos de que la base de datos exista y crearla, de ser necesario, antes de inicializar.

nodeServer.js
r.connect(config.rethinkdb)
.then(function(conn) {
    r.dbList().run(conn)
    .then(function(dbList){
        if (dbList.indexOf(config.rethinkdb.db) > -1)
        {
            initialize(conn);
        } else {
            r.dbCreate(config.rethinkdb.db).run(conn)
            .then(initialize(conn))
        }
    })
})
.error(function(error){
    console.log(err.message);
    process.exit(1);
});

En la siguiente parte del tutorial veremos como agregar los endpoints de nuestra API con Express.

Cesar
Cesar
reicek

1978Puntos

hace 6 años

Todas sus entradas
Escribe tu comentario
+ 2
0

No hay un script de arranque y el tutorial no indica como crearlo.

cuando hago npm start me aparece un error indicando “missing script: start”

1
1668Puntos
3 años

En tu package.json en el objeto “scripts” agrega una nueva linea:

"start" : "node nodeServer.js"

Por tu terminal ejecutas “npm start”. En todo caso si no quieres hacer esto ejecuta en tu consola “node nodeServer.js”