Desarrollar aplicaciones Node.js con Express es sin duda una opción muy popular, sin embargo no es la única opción y puede que ni siquiera sea la mejor. Recientemente empecé a investigar Hapi que se define a sí mismo como un marco para servicios, algo que no existía exactamente cuando apareció Express.
Anteriormente había escrito sobre creación de una API RESTful con Node.js y Expresspero esta vez vamos a explorar la posibilidad de hacer lo mismo con Hapi.
Antes de invertir demasiado en el código, tenemos que averiguar qué es exactamente lo que vamos a construir. El objetivo aquí es crear una aplicación de dos puntos finales. Un punto final debe permitirnos crear datos en la base de datos y el otro debe permitirnos leer de la base de datos.
Cree un nuevo directorio de proyecto en algún lugar de su ordenador y ejecute el siguiente comando desde el símbolo del sistema dentro de ese directorio:
1 |
npm init -y |
El comando anterior creará un nuevo proyecto Node.js estableciendo un directorio paquete.json archivo. El siguiente paso es instalar cada una de las dependencias del proyecto.
Ejecute lo siguiente desde la línea de comandos:
1 |
npm instale couchbase hapi joi uuid --guardar |
El comando anterior descargará el SDK de Couchbase Node.js, el framework Hapi, Joi para la validación de datos, y un paquete para generar valores UUID para representar nuestras claves de documentos NoSQL.
Siga adelante y cree un app.js dentro de su proyecto. Aquí es donde tendremos toda nuestra información de enrutamiento y lógica de base de datos. Abra este app.js e incluya el siguiente código JavaScript:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
const Hapi = requiere("hapi"); const Couchbase = requiere("couchbase"); const UUID = requiere("uuid"); const Joi = requiere("joi"); const servidor = nuevo Hapi.Servidor(); const N1qlQuery = Couchbase.N1qlQuery; const grupo = nuevo Couchbase.Grupo("http://localhost"); const cubo = grupo.openBucket("por defecto", ""); servidor.conexión({ "anfitrión": "localhost", "puerto": 3000 }); servidor.ruta({ método: "GET", ruta: "/", manipulador: (solicitar, respuesta) => { devolver respuesta("Hola Mundo"); } }); servidor.iniciar(error => { si(error) { tirar error; } consola.registro("Escuchar en" + servidor.información.uri); }); |
El código anterior nos pondrá en marcha. Importa cada una de las dependencias de nuestro proyecto, inicializa Hapi para un host y puerto específicos, y establece una conexión con Couchbase. También hemos definido una única ruta para representar nuestra ruta raíz.
Para este ejemplo, Couchbase se ejecutará localmente y utilizaremos un Bucket llamado por defecto
. Para obtener información sobre la instalación de Couchbase, consulte mis tutoriales de Mac, Linuxy Windows.
Ahora podemos preocuparnos de nuestros dos puntos finales que interactúan con la base de datos.
El primer punto final, y probablemente el más sencillo, servirá para devolver una lista de documentos, en este caso personas, que se hayan creado previamente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
servidor.ruta({ método: "GET", ruta: "/gente", manipulador: (solicitar, respuesta) => { var declaración = "SELECT `" + cubo.Nombre + "`.* FROM `" + cubo.Nombre + "WHERE type = 'person'"; var consulta = N1qlQuery.fromString(declaración); cubo.consulta(consulta, (error, resultado) => { si(error) { devolver respuesta(error).código(500); } devolver respuesta(resultado); }); } }); |
Fíjese en el manipulador
método. En él construimos una consulta N1QL que obtiene todos los documentos que tienen un tipo
que coincida con persona
. Esto significa que podemos tener muchos otros tipos de documentos que no serán recogidos por nuestra consulta.
Si hay algún problema con la consulta, devolveremos un error con un código de respuesta 500, de lo contrario devolveremos los resultados de la consulta.
El siguiente endpoint es donde hacemos uso de Joi para la validación de datos. Echa un vistazo al siguiente código JavaScript:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
servidor.ruta({ método: "POST", ruta: "/persona", config: { valide: { carga útil: { nombre: Joi.cadena().obligatorio(), apellido: Joi.cadena().obligatorio(), tipo: Joi.cualquier().prohibido().por defecto("persona"), marca de tiempo: Joi.cualquier().prohibido().por defecto((nuevo Fecha()).getTime()) } } }, manipulador: (solicitar, respuesta) => { cubo.insertar(UUID.v4(), solicitar.carga útil, (error, resultado) => { si(error) { devolver respuesta(error).código(500); } devolver respuesta(solicitar.carga útil); }); } }); |
Cuando un cliente intenta consumir desde este endpoint, la validación ocurre como parte de Hapi. En este proceso de validación inspeccionamos la carga útil y nos aseguramos de que cada una de nuestras propiedades cumple los criterios. En este caso, tanto nombre
y apellido
deben estar presentes. Está prohibido tipo
y marca de tiempo
en el cuerpo de la petición. Si existen, se devolverá un error. Si no existen, se utilizará un valor por defecto.
Si nuestra validación pasa, podemos insertar los datos en Couchbase con un id único. Los datos también serán devueltos en la respuesta.
Conclusión
Acaba de ver cómo crear una API RESTful muy sencilla con Hapi y Servidor Couchbase. He estado usando Express desde el principio, pero cuando se trata de Hapi, siento que fue mucho mejor diseñado para la creación de servicios web. Sin embargo, ambos harán el trabajo y si quieres ver una alternativa a Express, echa un vistazo a esto tutorial anterior Escribí.
Para obtener más información sobre el uso de Couchbase con Node.js, consulte la página Portal para desarrolladores de Couchbase.
así que parece que esto puede ser un poco anticuado con los cambios de Hapi.js por lo que si usted está usando una versión más reciente de Hapi, tuve que codificarlo así
const Hapi = require("hapi");
const Couchbase = require("couchbase");
const UUID = require("uuid");
const Joi = require("joi");
const servidor = nuevo Hapi.Servidor({
host: 'localhost',
puerto: 3000
});
const N1qlQuery = Couchbase.N1qlQuery;
const cluster = new Couchbase.Cluster("http://localhost");
const bucket = cluster.openBucket("default", "");
servidor.route({
método: "GET",
ruta: "/",
handler: (request, response) => {
devolver "Hola Mundo";
}
});
server.start(error => {
if(error) {
arrojar error;
}
console.log("Escuchando en " + server.info.uri);
});