Práticas recomendadas e tutoriais

Tutorial: Criar um aplicativo de pontos de interesse com Vue.js, Node.js, Express e Couchbase Server

Couchbase v5.5.0 red License Apache%202.0 green

O que vamos construir

Vamos criar um aplicativo da Web de página única que mostra pontos de interesse (POI) em torno de hotéis selecionados em uma lista de cidades. Os POIs serão exibidos em um mapa interativo do Google. Aqui está uma animação mostrando os resultados finais.

Animated Application Demo

Há algumas reviravoltas extras para mostrar algumas técnicas mais avançadas.

  • As cidades são escolhidas combinando aeroportos que tenham hotéis próximos na mesma cidade.
  • Recuperamos os POIs usando uma chamada REST, mas os salvamos em nosso banco de dados.
  • O lado do cliente recebe dados por meio de pushes usando eventos enviados pelo servidor.

Embora o código seja curto, ele mostra várias técnicas com os recursos de dependência de propriedade e vinculação de dados reativos do Vue. Combinado com alguns recursos avançados do Couchbase, teremos um aplicativo bom e funcional com pouco trabalho.

O que você precisa

O aplicativo foi desenvolvido inteiramente em JavaScript. Você precisa de apenas alguns elementos para começar.

  1. Node.js instalado
  2. Servidor Couchbase 5.5.0 ou posterior instalado

Você também precisará obter chaves para o API JavaScript do Google Maps e o APIs REST da HERE. Ambos podem ser usados gratuitamente (com limitações).

Os dados para o aplicativo são fornecidos como uma amostra incorporada à distribuição do Couchbase Server.

Primeiros passos

Criaremos a estrutura do aplicativo começando com o código do cliente Web. Em seguida, vem o código Node + Express do lado do servidor. Por fim, examinaremos o lado do servidor Couchbase.

Daremos uma olhada mais detalhada nas consultas N1Ql, incluindo Junção com a ANSI. Este aplicativo utiliza o novo Serviço e funções de eventos. Para concluir, examinaremos o código JavaScript.

Para começar, crie um novo diretório no qual você deseja manter o projeto. Abra um prompt de comando e vá para esse diretório.

O esqueleto do cliente Web

Geração do andaime do cliente Vue.js

O cliente web usa Vue.js.

Usaremos o Vue CLI para criar o projeto básico para nós. Mostrarei uma integração fácil entre o lado do cliente e do servidor com o webpack. Para isso, será necessário reorganizar um pouco os arquivos.

Instale o Vue CLI usando o npm, caso ainda não o tenha.


Gosto de usar Bootstrap. Há pelo menos alguns projetos que integram o Boostrap ao Vue. Eu escolhi o Bootstrap-Vue. Isso não é realmente necessário. Não é muito difícil remover essa dependência, se você quiser.

Criar o boilerplate do projeto. É aqui que entra o modelo simples do Webpack. O modelo inicial fará algumas perguntas. Não há problema em usar os padrões.

Reestruturação e correção

Agora, vá para o diretório do cliente. Mova o diretório package.json e .gitignore criados em um nível superior. Dessa forma, eles serão compartilhados em todo o projeto.


A configuração do webpack também tem um pequeno erro. Abrir webpack.config.js. Na seção que começa com


altere a linha de opções para que fique

Instalar dependências e compilar

Inicialize e instale as dependências básicas.


Instale nossas outras dependências. Muitas delas são pacotes padrão (morgan, body-parser). Eu uso o áxis para chamadas de rede. canal sse é um bom pacote de eventos enviados pelo servidor. Ele é um pouco mais sofisticado e mais fácil de usar do que outros que já experimentei. E há um pacote para facilitar o trabalho com o Google Maps no Vue chamado vue2-google-maps.

Instale o restante das dependências da seguinte forma. Isso inclui o que precisaremos para o servidor.


Isso lhe dará um front-end funcional baseado em Vue. Para construí-lo, já que mudamos o package.json para um nível superior, precisamos ajustar a seção de scripts npm. Editar package.json na raiz do projeto e altere a linha de compilação para


Agora, no cliente, faça npm run build.

Você pode abrir o index.html agora, mas ele não funcionará. Vamos pular para a criação do servidor, ou você pode tentar corrigir o problema aqui se quiser apenas ver o cliente autônomo.

O esqueleto do servidor web

Navegue de volta para a raiz do projeto e prepare o diretório do servidor.

Vamos criar o servidor diretamente. Inicie o aplicativo básico editando um novo arquivo app.js. Cole o seguinte e salve.

Esta é uma versão simplificada da final. Ela serve apenas o cliente padrão que criamos anteriormente.

Nesse ponto, você deve ser capaz de executar nó app.js no diretório do servidor. Abra uma guia do navegador e navegue até http://localhost:8080. Você deverá ver algo parecido com isto.

Vue Client Template

Desenvolvendo o cliente e o servidor

O código do cliente Web

Agora, voltaremos e criaremos o cliente real. No diretório do cliente, no subdiretório src, abra o arquivo App.vue. Atualize-o da seguinte forma.

Essa é a maior parte do código do lado do cliente.

Não entrarei em detalhes sobre a seção do modelo ou o CSS. Vou destacar um elemento interessante. A API Here retorna, entre outras coisas, links para ícones adequados para uso no Maps. Se você acompanhar o fluxo, verá que os marcadores de mapa estão carregando esses ícones diretamente usando os URLs de inclusão.

Conexão da ligação de dados do Vue

Percorrendo a seção do script, você verá que faço uso intenso dos recursos reativos do Vue. Para entender essa parte, será útil se você tiver pelo menos alguma familiaridade com o Vue, especialmente propriedades computadas e observadores, dados, método e ganchos de ciclo de vida.

Fazemos uso do montado para adicionar um ouvinte para eventos enviados pelo servidor e para preencher inicialmente a lista suspensa de cidades. O trabalho mais pesado da lógica comercial aqui acontece na consulta ao banco de dados, como veremos.

Vamos acompanhar como funciona a seleção de uma cidade. Observe que cada item no menu suspenso do botão tem um ouvinte de clique vinculado que define selecionado para os dados da cidade para essa entrada. Temos um método watch definido em selecionado. O Vue também sabe automaticamente que a propriedade computada exibição depende de selecionado.

Isso significa que sempre que uma cidade é selecionada por meio do menu suspenso, temos uma cascata de atividades. Mudança selecionado causas exibição a ser recalculado. Isso, por sua vez, define o texto do botão suspenso, já que ele está vinculado a exibição. O selecionadono método assistir aciona uma atualização da tabela de listagem de hotéis sempre que uma nova cidade é selecionada.

A tabela itens estão vinculados a destinationsProvider sob métodos. A atualização da tabela faz com que esse código seja executado. Como a lista de cidades original, ele extrai os hotéis por meio de uma chamada assíncrona ao nosso banco de dados por meio de um endpoint REST do servidor.

O Vue cuida de muitas coisas aqui para nós. Por exemplo, a chamada para atualizar a tabela não recebe dados imediatamente. O Vue renderizará novamente as partes relevantes do DOM automaticamente sempre que a chamada REST retornar. Não precisamos fornecer nenhum dos cabos, a não ser especificar a ligação entre itens e provedor de destino.

Conclusão do cliente Web

Para finalizar o lado do cliente, temos algumas outras etapas curtas a serem executadas. Precisamos importar o módulo para ajudar com o Google Maps e fornecer uma chave. Editar main.js. Adicione uma linha de importação e diga ao Vue para usar o novo componente. Aqui está o código final.

Carregamos a chave da API do Google Maps de um arquivo config.js. Crie esse arquivo e, por enquanto, adicione este código de espaço reservado.

Crie o projeto novamente (npm run build). Inicie o servidor, recarregue o site e você verá o início do nosso cliente real com esta aparência.

Initial Version of Tutorial Client

O código do servidor web

Em seguida, preencheremos o lado do servidor. Nosso servidor alimenta as páginas da Web e expõe a API REST de que precisamos. A API é, em sua maior parte, apenas um pacote de conveniência em torno da funcionalidade do banco de dados.

Na fonte do servidor, substitua nosso app.js com isso.

As principais diferenças são a configuração do cliente Node do Couchbase Server e a conexão das rotas para os pontos de extremidade REST. Há outros códigos adicionais para coisas como servir em http e https também. Não examinaremos essas partes.

Conexão com o servidor Couchbase

Os dois blocos de código para conexão ao nosso banco de dados são muito simples.

As três primeiras linhas importam o cliente Node do Couchbase, criam um novo objeto de cluster que representa um cluster de nós de banco de dados e autenticam esse cluster. Isso inicia a conexão com o banco de dados.

Por conveniência, adicionamos referências aos objetos do cliente e do cluster ao app.locals. Isso os torna disponíveis globalmente.

Por fim, o código estabelece e salva conexões com dois buckets. Baldes são uma estrutura organizacional de alto nível no Couchbase.

O primeiro bucket será preenchido com dados de amostra que vêm com as instalações do Couchbase Server. Para o segundo bucket, estou fazendo algumas alterações. Precisamos de um bucket de metadados para o Serviço de eventos. Como veremos, precisamos de apenas alguns documentos extras armazenados, que precisam ir para algum lugar além do bucket principal. Em vez de criar um terceiro bucket, eu os coloco junto com os dados de eventos. Normalmente, você não usaria esse atalho na produção.

Arquivos estáticos e rotas de API

Temos apenas algumas linhas de código que precisamos direcionar ao Express para servir nossas páginas estáticas criadas a partir do código do cliente e para organizar nossa API de dados do servidor.

O modelo index.html A página inicial do aplicativo adiciona dist para todos os caminhos de arquivos. Isso significa que nossos arquivos estáticos são realmente servidos a partir de um diretório raiz de /cliente/dist.

Separei a API de dados em dois grupos, organizados em uma categoria geral rotas subdiretório. Há os pontos de extremidade que começam com registros. Eles recuperam dados do banco de dados.

O eventos A rota é exclusiva. Os pontos de extremidade são usados pelo cliente da Web e pelo Couchbase Eventing Service.

Vamos dar uma olhada no registros código primeiro.

API de acesso ao banco de dados

Temos três rotas definidas aqui, /destinos, /hotels/byCity/:ide /select/geo. Todos eles têm a mesma estrutura básica. Obtemos nossas referências de banco de dados, usamos o bluebird para criar versões de promessa do método de consulta, construímos um N1QL disparar a consulta e retornar os resultados.

Vamos analisar as consultas, começando pela mais simples.

Consultas N1QL

Usamos o /select/geo para armazenar a escolha atual de hotel feita pelo usuário. Aqui está a consulta dividida.

UPSERT modificará um documento ou o criará se ele ainda não existir. Armazenamos a geolocalização do hotel escolhido em um documento com um id de gatilho. Isso provavelmente parece estranho. Isso fará mais sentido mais tarde, quando chegarmos ao código Eventing. O que realmente nos interessa não é apenas a localização do hotel, mas os pontos de interesse próximos. Esse documento acionará a sequência que recupera esses POIs. Daí a razão para chamar o documento gatilho.

Aqui está um exemplo do documento criado.

gatilho

Para entender o /hotels/byCity/:id consulta, primeiro dê uma olhada em alguns documentos de exemplo.

hotel_1359

aeroporto_1361

Para nossa tabela de hotéis, precisamos do nome do hotel, endereço, geolocalização, nome do aeroporto e código do aeroporto. Obviamente, isso é uma combinação de dados de ambos os documentos. Fazemos isso usando um INNER JOIN. Aqui está a pergunta.

Ao analisá-lo, você pode ver que conseguimos realizar a união usando documentos do mesmo bucket. Eu uso aliases para deixar as coisas mais claras. Usamos a cidade de cada documento para formar a condição de união. Observe que também uso o documento tipotanto na condição de união quanto na condição de ONDE cláusula. As condições de união podem ser bastante sofisticadas. Leia isto blog para obter mais detalhes e exemplos.

Por fim, vamos examinar como chegamos à nossa lista de cidades em primeiro lugar. Esta é a consulta para o /destinosponto final.

O único resultado retornado é uma lista de nomes de cidades. Nesse caso, estamos usando uma junção interna efetivamente como um filtro. Ao fazer a correspondência entre cidades aeroportuárias e cidades hoteleiras, obtemos uma lista apenas das cidades que têm ambas.

As uniões internas podem usar duas abordagens diferentes em termos de algoritmo. A primeira união que examinamos usa a união de loop aninhado padrão.

Este último exemplo usa uma tabela de hash na memória. Isso pode acelerar significativamente uma união, especialmente quando um dos dois conjuntos de dados é pequeno. Usamos a tabela "USE HASH()" para informar ao N1QL como queremos que a consulta seja otimizada. Há um lado "probe" e um lado "build". A tabela de hash é criada a partir dos dados do lado da construção. A junção é realizada fazendo pesquisas a partir dos dados do lado da sonda.

A dica que demos acima diz ao N1QL para usar os dados do hotel para o lado da sonda nesse caso. Ou seja, ele criará a tabela a partir dos dados do aeroporto e, em seguida, fará as pesquisas de hash usando os dados do hotel.

Se ainda não o fez, recomendo que experimente essas consultas diretamente no Couchbase Server Query Workbench, parte do console de administração da Web.

Eventos enviados pelo servidor

Já mencionamos a configuração de um ouvinte de eventos para eventos enviados pelo servidor no lado do cliente. Esses dois pontos de extremidade mostram o que é necessário no servidor.

A versão "get" do poi é chamado pelo navegador quando o ponto de extremidade Origem do evento é construído. Você pode ver que simplesmente adicionamos o chamador como um cliente.

Usamos a versão "post" como intermediária para enviar dados ao cliente. A versão res.send(''); dá uma dica de como isso funciona. No código Eventing, usaremos os recursos cURL do N1QL para enviar dados para esse endpoint. A resposta vazia está lá para encerrar essa transação.

Em seguida, o servidor encaminha os dados para todos os clientes que estiverem ouvindo. Há muito mais detalhes. Se você quiser saber mais, este artigo tem boas informações.

Finalização do servidor

Para concluir o lado do servidor do nosso projeto, crie um subdiretório rotas no diretório do servidor.

Copiar o registros acima em um arquivo em rotas chamado registros.js. Copiar o eventos código acima em um arquivo chamado eventos.js. E, finalmente, no próprio diretório do servidor, crie um novo arquivo chamado .env. Cole os seguintes parâmetros de configuração e salve. (É claro que você pode alterar as configurações conforme necessário).

O servidor deve estar pronto para funcionar agora. No diretório raiz do servidor, execute nó app.js. Não se esqueça de criar o código do cliente primeiro.

Código do serviço de eventos do Couchbase Server

Aqui está a última parte do molho especial que faz esse aplicativo funcionar. Na versão 5.5.0, o Couchbase introduziu a função Serviço de eventos. Esse é provavelmente o meu novo recurso favorito na série de versões 5.5. O Couchbase Functions é o primeiro componente oferecido como parte desse serviço. Em resumo, o Functions permite que você execute código no servidor de banco de dados em resposta a alterações no banco de dados.

As funções são escritas em JavaScript padrão, com algumas acréscimos e restrições. Para criar a função de que precisamos, siga estas etapas.

Balde de metadados de eventos

Primeiro, crie um compartimento para os metadados de eventos.

  • Abra o console do Couchbase Server e faça login, se necessário
  • Clique em "Buckets" (Compartimentos) no menu do lado esquerdo
  • Clique em "Add Bucket" no canto superior direito
  • Entrar eventos para o nome do balde na caixa de diálogo que é exibida
  • Clique em "Add Bucket" para concluir

Adição de uma função

Agora, configure a função e adicione o código.

  • Clique em "Eventing" no menu do lado esquerdo
  • Clique em "Add Function" (Adicionar função) no canto superior direito

Isso abrirá uma caixa de diálogo.

  • Selecione amostra de viagem como o Bucket de origem
  • Selecione eventos como o Bucket de Metadados
  • Entrar monitor (ou o que você quiser) para o nome da função
  • Em "Bindings", defina tipo para "Alias", nome para "travel-sample" e valor para "db"
  • Clique em "Next: Adicionar código"

Adding a Function

Isso o levará ao editor de código. Ele é pré-preenchido com as assinaturas de função. Em vez disso, copie este código.

https://gist.github.com/HodGreeley/9e25f9072247e180ec5cd764d9048c3b#file-poi-js

Implementação de uma função

Para implementar esse código, primeiro clique em "Save" (Salvar) e, em seguida, clique novamente em "Eventing" (Eventos) no menu do lado esquerdo. Você deverá ver uma entrada para a função. Clique em qualquer lugar dessa barra. Você verá que ela se expande.

Deploying a Function

Clique em "Deploy" e, em seguida, clique em "Deploy Function".

Entendendo o código de função

Sobre a atualização é chamado sempre que um documento é alterado. Ele recebe o documento e os metadados do documento como parâmetros.

Estamos procurando o gatilho documento a ser alterado, indicando a seleção de um novo hotel. A primeira linha filtra todos os outros documentos com base no ID do documento (às vezes chamado de chave do documento).

A próxima linha mostra alguns aspectos interessantes. Lembre-se db é um alias para o bucket de amostras de viagem. db['here'] recupera diretamente um documento com id aqui. É aqui que armazenaremos as credenciais necessárias para o AQUI serviços de mapeamento.

Preparamos a URL e os dados para nossa solicitação de pontos de interesse. O Here tem muitos recursos interessantes em sua API. Estamos apenas fazendo uma solicitação básica.

Com essas informações em mãos, estamos prontos para nossa chamada cURL. Ao criar a consulta N1QL, vemos uma das modificações no JavaScript padrão: Você pode escrever suas consultas em linha da mesma forma que as construiria no Query Workbench.

Vemos outro detalhe interessante na consulta cURL. O N1QL oferece uma sintaxe conveniente para filtrar resultados. Ao adicionar o caminho .resultados.item até o final, obtemos apenas os dados que desejamos.

Em seguida, executamos a consulta e, usando o mesmo db[] abreviado, atualize nosso poi documento. Esse é um exemplo de uso de uma função para aumentar os dados. Em outro cenário, podemos derivar nossa atualização inteiramente de registros no banco de dados. Por exemplo, você pode preencher todos os detalhes de um carrinho de compras à medida que um cliente faz seleções.

Por fim, com nossos pontos de interesse em mãos, usamos novamente o cURL para enviar os dados ao endpoint do nosso servidor Web. Lembre-se da versão "post" da função poi A API ingere os dados recebidos e os envia de volta a todos os clientes registrados. Assim, podemos fazer com que a interface do usuário do cliente reaja às alterações no banco de dados sem precisar fazer pesquisas.

Etapas finais

Agora estamos prontos para juntar tudo isso. Você pode experimentar o aplicativo como está, mas a parte de mapas ainda não funcionará. Para isso, você precisa de uma chave da API do Google Maps e de um conjunto de credenciais da HERE.

A chave do Maps vai para o config.js no código do cliente. Salve as chaves HERE em um documento na pasta eventos balde. Você pode fazer isso diretamente no console de administração clicando em "Documents" (Documentos) no menu à esquerda e, em seguida, em "Add Document" (Adicionar documento) no canto superior direito. Use isso como um modelo.

aqui

E, por último, como medida de segurança, o cURL é desativado por padrão. No console de administração, faça o seguinte.

  • Clique em "Settings" (Configurações) no menu do lado esquerdo
  • Clique para expandir "Configurações avançadas de consulta"
  • Selecione "Unrestricted" (Irrestrito) em "CURL() Function Access" (Acesso à função CURL())

Isso é não o que você deseja para a produção. Em vez disso, você desejaria uma lista branca de um conjunto selecionado de URLs. No entanto, isso será suficiente para o nosso projeto.

Com isso, no diretório do servidor da Web, execute nó app.js. Abrir localhost:8080 em seu navegador (ou o que você escolheu em .env) e experimentá-lo.

Fonte

Você pode encontrar o código-fonte de todo o aplicativo no GitHub aqui. Incluí um script configuração para simplificar a preparação de tudo. Basta executar ./setup e forneça suas chaves. (Talvez seja necessário torná-lo executável primeiro.) Você ainda precisa executar npm installe criar o código do cliente.

Webinar

Este aplicativo foi usado como parte de uma demonstração em um webinar do Couchbase. Você pode ver uma gravação dele aqui. Não deixe de conferir outros webinars na área de recursos do Couchbase.

Pós-escrito

O Couchbase é de código aberto e grátis para experimentar.
Comece a usar com código de amostra, consultas de exemplo, tutoriais e muito mais.
Encontre mais recursos em nosso portal do desenvolvedor.
Siga-nos no Twitter @CouchbaseDev.
Você pode postar perguntas em nosso fóruns.
Participamos ativamente de Estouro de pilha.
Entre em contato comigo pelo Twitter com perguntas, comentários, tópicos que você gostaria de ver etc. @HodGreeley

Compartilhe este artigo
Receba atualizações do blog do Couchbase em sua caixa de entrada
Esse campo é obrigatório.

Autor

Postado por Hod Greeley, Advogado do desenvolvedor, Couchbase

Hod Greeley é um defensor dos desenvolvedores da Couchbase e mora no Vale do Silício. Ele tem mais de duas décadas de experiência como engenheiro de software e gerente de engenharia. Trabalhou em diversas áreas de software, incluindo física e química computacional, segurança de computadores e redes, finanças e dispositivos móveis. Antes de ingressar na Couchbase em 2016, Hod liderou as relações com desenvolvedores para dispositivos móveis na Samsung. Hod é Ph.D. em física química pela Universidade de Columbia.

Um comentário

  1. Boa postagem! Obrigado.

    O primeiro link para o repositório do github é ruim. Ele tem um ":" no final.

Deixe um comentário

Pronto para começar a usar o Couchbase Capella?

Iniciar a construção

Confira nosso portal do desenvolvedor para explorar o NoSQL, procurar recursos e começar a usar os tutoriais.

Use o Capella gratuitamente

Comece a trabalhar com o Couchbase em apenas alguns cliques. O Capella DBaaS é a maneira mais fácil e rápida de começar.

Entre em contato

Deseja saber mais sobre as ofertas do Couchbase? Deixe-nos ajudar.