Não faz muito tempo, escrevi sobre Criação de um encurtador de URL com Node.js e Couchbase N1QL. Se você ainda não o viu, o artigo é uma ótima introdução ao Couchbase e à criação de APIs RESTful usando Node.js e Express Framework. A desvantagem desse artigo, e não é uma desvantagem ruim, é que você precisa preferir escrever consultas SQL para gerenciar seus dados NoSQL.

E se você preferir usar um Modelo de Documento de Objeto (ODM) em vez de escrever consultas?

Desta vez, vamos explorar o processo de desenvolvimento por trás da criação de um encurtador de URL que usa Ottoman ODM, Couchbase Server e Node.js.

Os requisitos

Não há muitos requisitos para o sucesso desse aplicativo. Por exemplo, o que você precisará instalar e configurar é o seguinte:

  • Servidor Couchbase 4.1+
  • Node.js 4.0+

Como este é um aplicativo Node.js, precisaremos dele instalado e usaremos o Node Package Manager (NPM) para reunir todas as dependências do nosso projeto. Para aproveitar ao máximo o Ottoman, queremos usar o Couchbase 4.1 ou superior.

Entendendo o modelo de dados e preparando o banco de dados do Couchbase

Para este exemplo, vamos criar um bucket chamado exemplo no Couchbase Server. Você não precisa chamá-lo assim, mas ao longo do artigo faremos referência a ele como tal. Não é necessário nenhum índice ou configuração adicional em nosso cluster além da criação do bucket.

Em termos de dados, o plano é armazenar um documento para cada URL que desejamos reduzir. Cada documento pode ter a seguinte aparência:

O _tipo é algo definido pelo modelo Ottoman, mas as outras três são propriedades que definiremos. O hash representará um hash exclusivo de um valor. Esse hash funcionará como identificador em cada um de nossos URLs curtos.

Desenvolvimento do aplicativo encurtador de URL do Node.js

Com o banco de dados pronto e um entendimento básico do nosso modelo de dados, podemos trabalhar na criação do nosso aplicativo encurtador de URLs Node.js. O aplicativo dependerá muito do Express Framework e de uma biblioteca chamada Hashids. Usaremos Hashids para evitar o trabalho de escrever nosso próprio algoritmo de hash curto.

Criando o projeto com as dependências

Vamos começar criando um novo projeto Node.js e instalando todas as dependências necessárias do projeto. No Terminal (Mac e Linux) ou no Prompt de Comando (Windows), execute o seguinte:

O comando acima criará um novo package.json para o nosso projeto. Esse arquivo conterá todas as informações de dependência, além de outras coisas.

Agora, precisamos instalar cada uma das dependências necessárias em nosso projeto:

O comando acima instalará o SDK do Couchbase, a estrutura Express, o Ottoman, o Hashids e a biblioteca Body Parser para aceitar dados do corpo em solicitações HTTP.

Nesse ponto, podemos começar a inicializar o aplicativo para prepará-lo para o trabalho pesado.

Inicialização do aplicativo

Para simplificar, todo o código do nosso aplicativo residirá em um único arquivo dentro do nosso projeto chamado index.js. Em um ambiente de produção, você provavelmente desejaria dividi-lo para facilitar a manutenção, mas para este exemplo muito simples não haverá problema.

Abra o index.js e incluir importações para cada uma das dependências que instalamos:

Com as dependências importadas, agora podemos inicializá-las para uso no aplicativo:

No exemplo acima, estamos basicamente dizendo que queremos inicializar o Express Framework e aceitar JSON e dados do corpo codificados por URL das solicitações.

Nesse ponto, podemos estabelecer uma conexão com nosso cluster do Couchbase e abrir o bucket do aplicativo:

Para usar o Ottoman, alguns índices precisam existir. Para nossa sorte, podemos fazer com que o Ottoman crie esses índices para nós se eles ainda não existirem. Depois de termos certeza de que eles existem, podemos começar a servir o aplicativo.

Em nosso exemplo, o aplicativo será servido localmente na porta 3000.

Até agora, só temos a estrutura básica em funcionamento para nosso aplicativo encurtador de URL. Na verdade, não temos nenhuma lógica de encolhimento ou interação com o banco de dados em relação a operações CRUD ou de consulta.

Criação do modelo de dados

Sabemos como os dados serão exibidos no banco de dados, mas ainda não sabemos como criá-los. Como estamos usando um ODM em vez de consultas N1QL, precisamos definir o modelo em nosso código.

Nesse projeto específico, o modelo é muito simples. Ele seria parecido com o seguinte:

No modelo de dados acima, que estamos chamando de URLtemos três propriedades. As hash representará o ID do nosso documento. Não é obrigatório definir manualmente o ID do documento, mas para este projeto faz sentido. A definição manual de um id de documento exige que a propriedade seja somente leitura. As outras duas propriedades são valores de cadeia de caracteres padrão.

O modelo pode ser infinitamente mais complexo, dependendo de suas necessidades.

Aplicação do modelo de dados em uma série de métodos de ponto de extremidade RESTful

O aplicativo que estamos criando é um serviço da Web RESTful, portanto, precisamos criar algumas funções de endpoint. O aplicativo conterá os três endpoints públicos a seguir:

Quando o raiz for atingido, o aplicativo nos levará ao URL longo que está armazenado no Couchbase. Quando o /criar for atingido, tentaremos encontrar um URL curto salvo anteriormente ou criaremos um, caso ele não exista. Fazemos isso porque não queremos salvar várias cópias de um URL longo. Por fim, temos um /expandir para que possamos ver para onde vai nosso URL curto.

Começando com o /criar temos o seguinte método, que provavelmente é a parte mais complexa do nosso aplicativo:

O endpoint acima é um endpoint de solicitação POST que espera um corpo. Se nenhuma URL longa for encontrada no corpo, será retornado um erro. Caso contrário, será feita uma pesquisa otomana com base no URL longo fornecido. Se forem encontrados dados na pesquisa, esses dados serão retornados ao usuário; caso contrário, será iniciado um processo para criar uma nova entrada.

Durante a criação da nova entrada, um hash exclusivo é criado com base no registro de data e hora. Esse hash é anexado a um nome de host curto e salvo no banco de dados junto com o próprio hash e a URL longa. O objeto é retornado após um salvamento bem-sucedido.

Quando se trata de /expandir temos o seguinte:

O método é semelhante ao que vimos no /criar mas não é exatamente o mesmo. Em vez disso, fazemos uma pesquisa com base no URL curto fornecido. Se for encontrado, retornamos o documento que contém o URL longo; caso contrário, retornamos um objeto vazio.

Por fim, temos o raiz endpoint. Esse endpoint é responsável pelo redirecionamento para o URL longo e requer um ID que, na realidade, é o nosso hash. Lembre-se de que estamos hospedando a API e os URLs curtos no mesmo servidor.

Então, digamos que navegamos para http://localhost:3000/2xmx9qpyj no navegador. Os 2xmx9qpyj é o nosso ID, que também é o nosso valor de hash. Podemos fazer uma pesquisa de documento com base nesse ID e navegar se ele existir.

Não é tão ruim, certo?

O código-fonte completo do aplicativo

Caso queira ver o aplicativo completo reunido, você pode encontrá-lo abaixo.

Se você executar o código acima com npm index.js você pode começar a usar cada um dos pontos de extremidade da API encontrados em http://localhost:3000.

Conclusão

Você acabou de ver como criar um aplicativo encurtador de URL usando um modelo de documento de objeto (ODM) chamado Ottoman, Couchbase Server e Node.js. Se não for fã de ODMs ou se quiser ver como fazer isso com consultas SQL, você pode conferir um tutorial anterior Escrevi sobre o assunto.

Deseja levar este tutorial um passo adiante? Por que não tentar coletar informações analíticas das pessoas que tentam usar os URLs curtos? Você pode manter um contador de ocorrências dentro dos documentos antes da navegação ou até mesmo armazenar informações como agentes de usuário do navegador.

Autor

Postado por Nic Raboy, defensor dos desenvolvedores, Couchbase

Nic Raboy é um defensor das modernas tecnologias de desenvolvimento móvel e da Web. Ele tem experiência em Java, JavaScript, Golang e uma variedade de estruturas, como Angular, NativeScript e Apache Cordova. Nic escreve sobre suas experiências de desenvolvimento relacionadas a tornar o desenvolvimento móvel e da Web mais fácil de entender.

Deixar uma resposta