Ratnopam Chakrabarti es un desarrollador de software que trabaja actualmente para Ericsson Inc. Lleva bastante tiempo centrado en IoT, tecnologías máquina a máquina, coches conectados y dominios de ciudades inteligentes. Le encanta aprender nuevas tecnologías y ponerlas en práctica. Cuando no está trabajando, le gusta pasar tiempo con su hijo de 3 años.
En Parte 1 de esta serie de blogsEn el post anterior, vimos cómo podemos almacenar y recuperar metadatos de imágenes desde y hacia un bucket de Couchbase. En este post (Parte 2), vamos a echar un vistazo a los "me gusta" y mostrar por tagname características de la aplicación.
La idea aquí es utilizar HTML y jQuery en el lado del cliente que interactúan con los componentes de node como route.js que se ejecutan en el lado del servidor. Por ejemplo, el siguiente fragmento de jQuery se encuentra en el lado del cliente y hace una llamada Ajax a la "URL" que se expone como un archivo ruta dentro de route.js en el lado del servidor.
En como es un elemento de anclaje en el que al hacer clic se llama a una nueva ruta en la aplicación de nodo. Aquí está el fragmento:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
$(documento).en(clic, '.como', función(e){ consola.registro("Como clicado); var que = $(este); var URL = host + "/como/ + que.datos(fotoid); ajax({ url: URL, éxito:función(datos){ var parseData = JSON.analizar(datos.respuesta); que.encontrar('h4').html(parseData.le gusta); } }) }) |
La URL se forma añadiendo '/like/' y el id de la imagen al campo host variable. Una vez que la llamada Ajax se realiza con éxito, la devolución de llamada de éxito correspondiente analiza la respuesta JSON enviada desde el punto final del lado del servidor (routes.js).
A continuación se muestra la ruta correspondiente (en routes.js):
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 28 29 30 31 32 33 |
enrutador.consiga('/like/:id', función(consulte, res, siguiente){ ImageModel.getByDocumentId(consulte.parámetros.id, función(err, resultado){ var jsonFromDB = JSON.stringify(resultado); var docFromDBArr = JSON.analizar(jsonFromDB); var docFromDB = docFromDBArr[0]; var le gusta = docFromDB.le gusta; // incrementar el like en 1 le gusta = le gusta + 1; docFromDB.le gusta = le gusta; ImageModel.guardar(docFromDB, función(error, resultado) { si(error) { devolver res.estado(400).enviar(error); } res.estado(200).enviar({le gusta:docFromDB.le gusta}); }) }) }) |
La ruta anterior sirve la llamada desde el lado del cliente jQuery y también devuelve una respuesta HTTP de 200 y un cuerpo de respuesta JSON.
La ruta hace una llamada al getByDocumentId expuesta por ImageModel. Esta función, como se muestra a continuación, recupera un documento del bucket de Couchbase basándose en el id del documento pasado como argumento. Una vez que el documento es recuperado con éxito, el resultado es analizado y la función "me gusta" se incrementa en 1. El documento actualizado se guarda llamando a la función save().
La función getByDocumentId (definida en el archivo recordmodel.js):
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 28 29 |
/* * Obtener un documento concreto de Couchbase Server mediante una consulta N1QL parametrizada. */ ImageModel.getByDocumentId = función(documentId, devolución de llamada) { var declaración = "SELECT META(fotos).id, filename, likes, tags" + "FROM `" + config.couchbase.cubo + "Fotos AS" + "WHERE META(fotos).id = $1"; var consulta = N1qlQuery.fromString(declaración); db.consulta(consulta, [documentId], función(error, resultado) { si(error) { devolver devolución de llamada(error, null); } devolución de llamada(null, resultado); }); }; |
Mostrar imágenes por nombre de etiqueta
Para listar imágenes por una etiqueta concreta, tenemos que hacer lo siguiente:
- Pasar el tagname cuando se hace clic en el ancla
- Utilice el nombre de etiqueta para filtrar las imágenes
El tagname es pasado por el siguiente simple jQquery:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
$(documento).en(clic, '.showTag', función(e){ var que = $(este); var tagURL = host + '/getimages/' + que.datos(tagname); ajax({ url: tagURL, éxito:función(datos){ var imageList = JSON.analizar(datos.respuesta); renderImagesByTag (imageList); } }) }) |
Y la ruta correspondiente:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
enrutador.consiga('/getimages/:tagname', función(consulte, res, siguiente){ consola.registro('inside getimages by tagname'); ImageModel.getImagesByTag(consulte.parámetros.tagname, función(err, resultado){ var jsonFromDB = JSON.stringify(resultado); res.enviar(JSON.stringify(resultado)); }) }) |
En getImagesByTag se describe a continuación:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
ImageModel.getImagesByTag = función(tagName, devolución de llamada) { var declaración = "SELECT META(fotos).id, filename, likes, tags" + "FROM `" + config.couchbase.cubo + "` AS photos WHERE $1 IN tags"; var consulta = N1qlQuery.fromString(declaración); db.consulta(consulta, [tagName], función(error, resultado) { si(error) { devolver devolución de llamada(error, null); } devolución de llamada(null, resultado); }); }; |
Simplemente ejecuta la siguiente consulta utilizando N1QL:
select nombrefichero, gustos from galeriafotos where IN etiquetas;
Esto permite filtrar en base a tagname donde tags es un array de cadenas.
Por lo tanto, si tenemos dos imágenes con la misma etiqueta, la consulta anterior debería devolver ambas imágenes.
En este caso, ambos documentos tienen una etiqueta común denominada "Blossom". Ahora, si ejecutamos la consulta utilizando el Couchbase Query Workbench, obtendremos el siguiente resultado:
Como era de esperar, se devuelven dos registros. Esto es, en efecto, lo que ocurre en el método getImagesByTag () función.
Solución de problemas
Durante npm-install, si te encuentras con el siguiente error,
No se puede encontrar el ejecutable de Python "python", puede establecer la variable env PYTHON
haga lo siguiente para eliminar el error:
Instalar python
Añadir python a la ruta
Esto debería resolver el error ... al menos lo hizo para mí.
Este post forma parte del Programa de Escritura de la Comunidad Couchbase