Ratnopam Chakrabarti é um desenvolvedor de software que trabalha atualmente para a Ericsson Inc. Ele tem se concentrado em IoT, tecnologias máquina a máquina, carros conectados e domínios de cidades inteligentes por um bom tempo. Ele adora aprender novas tecnologias e colocá-las em prática. Quando não está trabalhando, gosta de passar o tempo com seu filho de 3 anos.

Esta é a Parte 1 de uma série de publicações em que apresentarei um aplicativo de galeria de fotos que permite que os usuários carreguem qualquer imagem de sua escolha (em formato .png ou .jpg) e vejam todas as imagens que foram carregadas por outros usuários. O aplicativo permite que os usuários "curtam" uma determinada imagem. Depois que um usuário carrega uma imagem, o aplicativo usa o serviço Amazon Web Services' API de reconhecimento para digitalizar e detectar rótulos para essa imagem. Os rótulos retornados com maior confiança são usados para marcar as imagens. O aplicativo também permite que os usuários cliquem em uma determinada etiqueta para visualizar todas as imagens com essa etiqueta.
Demonstração
Aqui está um link para a demonstração do aplicativo finalizado.
A pilha de tecnologia
Couchbase - Para armazenar metadados de imagens
Express - Para criar o front-end com o nó
AWS SDK e S3 - Para armazenar os arquivos de imagem e também para o reconhecimento de imagens
Node.js - Para criar o back-end do aplicativo
Além disso, o jQuery é usado para fazer chamadas Ajax do lado do cliente para os arquivos server.js.
O Node.js é usado para criar todas as APIs RESTful que o aplicativo utiliza. Ele usa as seguintes dependências para realizar o trabalho:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
package.json "aws-sdk": "*", "couchbase": "^2.3.3", "express": "4.13.0", "formidable": "1.0.17", "gm": "^1.20.0", "hogan-express": "^0.5.2", "knox": "^0.9.2", "socket.io": "1.0.5", "uuid": "^2.0.1" |
Veja para que servem esses módulos:
- O aws-sdk - usado para chamar as APIs do AWS Rekognition
- knox - usado para interagir com o Amazon S3
- gm - usado para redimensionar a imagem (não queremos armazenar imagens de tamanho grande no S3, afinal, ele tem um preço)
- formidable - usado para processar os arquivos de entrada
- hogan-express - fornece Bigode mecanismo de modelo para a estrutura express
- socket.io - usado para emitir eventos do servidor para o cliente que podem ser acionados
- couchbase - usado para interagir com o banco de dados do Couchbase
- uuid - usado para gerar IDs de documentos aleatórios para armazenar documentos JSON no Couchbase
Função do Couchbase
Estou usando o Couchbase neste aplicativo para
- armazenar metadados da imagem, como o nome do arquivo
- armazenar outras informações úteis, como o número de "curtidas" de uma imagem e as tags atribuídas a uma imagem
Nesta postagem (Parte 1), descreverei as etapas necessárias para usar o Couchbase com o aplicativo de galeria de fotos. O código-fonte completo do aplicativo está disponível em GitHub.
Instalar o Couchbase e outros módulos do Node
Para instalar todos os módulos listados no package.json acima, vá para o diretório raiz do aplicativo e digite:
|
1 |
npm install |
Depois que todos os módulos, inclusive o Couchbase, estiverem instalados, sua tarefa agora é usá-los no aplicativo.
Config.json
Defina algumas das informações configuráveis em um arquivo .json chamado config.json.
|
1 2 3 4 5 6 7 8 9 10 11 |
{ "couchbase": { "server": "127.0.0.1:8091", "bucket": "photogallery" } } |
Aqui, especifiquei o host e a porta do Couchbase Server e também o bucket em que as informações de metadados da imagem serão armazenadas.
server = 127.0.0.1:8091 (se você estiver executando o Couchbase localmente)
Depois que a configuração é definida, a próxima tarefa é importar essa configuração para o aplicativo expresso.
Aqui está um trecho do código do aplicativo:
|
1 2 3 4 5 6 7 |
var couchbase = require("couchbase"); var config = require("./config"); module.exports.bucket = (new couchbase.Cluster(process.env.COUCHBASE_HOST || config.couchbase.server)).openBucket( process.env.COUCHBASE_BUCKET || config.couchbase.bucket); |
Estamos usando algumas variáveis de ambiente aqui para identificar o host do Couchbase e o bucket. Se elas não forem fornecidas em tempo de execução, os valores serão padronizados para o config.json mencionado acima.
Executar e configurar o Couchbase
Como pré-requisito para executar o aplicativo localmente, primeiro é necessário instalar e executar o Couchbase Server. Vá para o diretório BASE DE SOFÁ DOWNLOAD PÁGINA e instale de acordo com seu próprio sistema operacional. No meu caso, estou executando uma instalação do Couchbase 4.6 em meu sistema Windows. Quando o Couchbase estiver instalado e funcionando, crie um bucket chamado "photogallery". Esse bucket armazenará todas as meta-informações da imagem. Um aspecto importante a ser observado é que é necessário criar um índice no bucket antes de usá-lo. Para criar um índice:
|
1 |
CREATE PRIMARY INDEX ON <bucketname> |
Depois que o índice for criado, vá até a guia Índice e o índice deverá ser listado.

Em um ambiente de produção, não é recomendável ter um índice secundário global, pois isso pode causar degradação do desempenho. No entanto, para a escala do nosso aplicativo, não há problema em tê-lo.
Salvar e recuperar documentos no Couchbase
O aplicativo de galeria de fotos faz as seguintes coisas:
- Quando o usuário seleciona o arquivo e clica em upload, o aplicativo armazena o arquivo em um bucket do Amazon S3.
- Depois que o arquivo é salvo no S3 com êxito, ele chama a API do AWS Rekognition para atribuir tags à imagem.
- Depois que as tags são atribuídas, o aplicativo armazena as informações de metadados da imagem no Couchbase Galeria de fotos balde.
Para salvar os dados no Couchbase, precisamos do seguinte trecho de código:
|
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 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
// import variables var uuid = require("uuid"); var db = require("../upload").bucket; var config = require("../config"); var N1qlQuery = require('couchbase').N1qlQuery; //define a model function ImageModel() { }; // define the save function ImageModel.save = function(data, callback) { var jsonObject = { filename: data.filename, likes: data.likes, tags: data.tags } // If the document id doesn't exist create a unique id for inserting var documentId = data.id ? data.id : uuid.v4(); db.upsert(documentId, jsonObject, function(error, result) { if(error) { callback(error, null); return; } callback(null, {message: "success", data: result}); }); } |
O que o código acima faz é importar as dependências apropriadas para interagir com o banco de dados Couchbase e definir uma função para salvar os dados. Um corpo JSON é criado com o nome do arquivo, os gostos e as tags de uma imagem e, em seguida, a função upsert() é chamada para salvar os dados. Se um documento não tiver um atributo "id" atribuído, a função criará um usando uuid.v4().
Para a recuperação de documentos, dê uma olhada no seguinte trecho de código:
|
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 |
/* * Get all documents from Couchbase Server using N1QL */ ImageModel.getAll = function(callback) { var statement = "SELECT META(photos).id, filename, likes, tags " + "FROM `" + config.couchbase.bucket + "` AS photos"; var query = N1qlQuery.fromString(statement).consistency(N1qlQuery.Consistency.REQUEST_PLUS); db.query(query, function(error, result) { if(error) { return callback(error, null); } callback(null, result); }); }; |
O trecho de código acima retorna todas as imagens do compartimento usando a consulta N1QL. Isso é útil para listar todas as imagens do compartimento da galeria de fotos. Observe que o bucket do Couchbase armazena somente o nome do arquivo, uma parte da url do Amazon s3 é estática e a url completa é criada anexando o nome do arquivo à url estática do s3 de uma imagem.
Parte estática -> https://s3.amazonaws.com/la-image-tagger-chakrar27/
Parte dinâmica -> nome do arquivo
Aqui, la-image-tagger-chakrar27 é o bucket s3 que criei. Para criar esse bucket, faça upload de este modelo cloudformation para o AWS e crie uma pilha. Ele criará o bucket s3.
Esta postagem faz parte do Programa de Redação da Comunidade Couchbase
[...] Na Parte 1 desta série do blog, vimos como podemos armazenar e recuperar metadados de imagens de e para um bucket do Couchbase. Nesta [...]