Hoje é o dia seu aplicativo Node.js aprende a "ir buscar".
Ao seguir este tutorial básico, você aprenderá a criar uma API REST para seu aplicativo Node.js que envia consultas SQL++ (também conhecidas como N1QL) para recuperar dados do Couchbase.
Esta postagem dá continuidade à minha série introdutória sobre Usando o Node.js com o Couchbaseincluindo funções assíncronas e Criação de uma API REST com Node.js e Express.
A postagem de hoje continua de onde as anteriores pararam, depois de criar uma API REST para recuperação direta de documentos.
Configuração do banco de dados do Couchbase
Esta postagem pressupõe que você tenha instalado o amostra de viagem
Balde que vem com tudo Couchbase instalações. É importante que você tenha esse conjunto de dados instalado, pois usaremos índices que são criados automaticamente e critérios específicos de documentos que são totalmente repetíveis.
A conectividade básica e a base da API REST já estão definidas em o roteiro que criamos juntos na semana passada. Vou incluí-lo no exemplo de código de hoje, mas você precisará ler todas as postagens anteriores (link acima) para obter uma explicação completa.
Além disso, para simplificar o exemplo de hoje, usaremos os escopos e as coleções padrão. Como de costume, quando se trata de consultar dados JSON, também presumo que você tenha conhecimento básico de JavaScript, Node.js e bancos de dados de documentos NoSQL.
Entendendo as consultas N1QL
O Linguagem de consulta N1QL para o Couchbase é quase exatamente igual ao SQL, com apenas algumas exceções.
Quando uma consulta N1QL solicita uma coluna específica de um Bucket, ela retorna uma lista de todos os documentos JSON correspondentes no Bucket. Se não houver dados no documento para a coluna, você receberá um NULL
a menos que seja filtrado com um valor ONDE
cláusula.
No mínimo, um índice primário deve estar disponível nos documentos para que esses documentos possam ser consultados. No entanto, o desempenho da consulta é aprimorado quando há um índice secundário definido para uma determinada coluna.
Esses dois índices podem ser criados com a própria consulta e podem ser feitos por meio de um script ou do Console da Web do Couchbase. Na verdade, você pode saber mais sobre esses índices e ver a consulta usada para criá-los explorando-os no console da Web.
No exemplo acima, há um índice criado na coluna chamada cidade
em qualquer documento que esteja no amostra de viagem
Balde.
Uma consulta de amostra
Antes de mergulhar no código, você pode executar consultas diretamente no console da Web para garantir que elas retornem o que você espera. Alterne para a seção Consulta
e digite a seguinte consulta e pressione Executar
.
1 |
SELECT * DE `viagens-amostra` ONDE cidade = Los Angeles; |
Os resultados mostram no console que 323 documentos corresponderam. Observe que uma mistura de documentos é retornada - hotéis, aeroportos, etc., conforme mostrado no tipo
coluna. (Agora, estou dizendo "colunas", mas é claro que elas são, na verdade, objetos/elementos JSON que podem ser incorporados a outros objetos).
Ajuste sua consulta para retornar apenas algumas colunas, como no exemplo abaixo.
1 |
SELECIONAR tipo, nome, cidade DE `viagens-amostra` ONDE cidade = Los Angeles; |
Criação de uma função de consulta
Antes de mergulhar no restante do código, começaremos examinando os fundamentos da passagem de consultas usando o SDK do Node.js.
Em vez de passar uma string de consulta totalmente formada, você deve usar os espaços reservados incorporados para tornar o código reutilizável. Nesse caso, use parâmetros nomeados: Sua consulta terá uma variável de espaço reservado e você passará uma variável com os valores a serem usados.
Primeiro, crie a variável de consulta:
1 |
const querystr = `SELECIONAR tipo, nome, cidade DE `viagens-amostra` ONDE cidade = $CIDADE;` |
Em seguida, crie a variável de parâmetros de entrada:
1 |
const parâmetros = { parâmetros: { CIDADE: Los Angeles }} |
Em seguida, passe ambos para a função de consulta de cluster para iniciar e retornar os resultados:
1 |
deixar resultado = aguardar agrupamento.consulta(querystr, parâmetros) |
A função completa que você criou agora é possível:
1 2 3 4 5 6 7 8 9 10 11 12 |
assíncrono função getQuery(){ const querystr = `SELECIONAR tipo, nome, cidade DE `viagens-amostra` ONDE cidade = $CIDADE;` const parâmetros = { parâmetros: { CIDADE: Los Angeles }} tentar { deixar resultado = aguardar agrupamento.consulta(querystr, parâmetros) console.registro("Resultado:", resultado) retorno resultado } captura (erro) { console.erro("A consulta falhou: ", erro) } }; |
REST-ificando sua consulta
A próxima etapa é adicionar essa função de consulta ao nosso exemplo anterior de código da API REST para que você possa receber um nome de cidade de entrada e retornar os resultados HTTP para o navegador.
Primeiro, faça com que a função passe em uma variável para o nome da cidade, como abaixo:
1 |
assíncrono função getQuery(nome da cidade){... |
Em seguida, crie um endpoint de consulta (em vez do obter
que usamos em uma postagem anterior) e mover a lógica da resposta REST para essa função.
1 2 3 4 5 6 7 8 9 10 11 |
aplicativo.obter('/query/:cityname', runAsync(assíncrono (req, res) => { var nome da cidade = req.parâmetros.nome da cidade; var querystr = `SELECIONAR tipo, nome, cidade DE `viagens-amostra` ONDE cidade = $CIDADE;` var parâmetros = { parâmetros: { CIDADE: nome da cidade}} aguardar agrupamento.consulta(querystr, parâmetros, função(erro, resultado){ res.json(resultado) }) })); |
Isso retorna o JSON RAW da chamada REST, conforme mostrado na imagem abaixo no navegador da Web ou na ferramenta da API REST do Postman.
Exemplo de código completo
Aqui está o resultado completo do código de amostra. Observe que alguns códigos anteriores de outros artigos foram mantidos para sua referência.
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 |
var aplicativo = exigir("expresso)(); var couchbase = exigir("couchbase"); assíncrono função principal(){ aplicativo.obter('/get/:docid', runAsync(assíncrono (req, res) => { var docid = req.parâmetros.docid; var docjson = aguardar getDoc(docid, função(erro, resultado){ res.json(resultado.conteúdo) }); })); aplicativo.obter('/query/:cityname', runAsync(assíncrono (req, res) => { var nome da cidade = req.parâmetros.nome da cidade; var querystr = `SELECIONAR tipo, nome, cidade DE `viagens-amostra` ONDE cidade = $CIDADE;` var parâmetros = { parâmetros: { CIDADE: nome da cidade}} aguardar agrupamento.consulta(querystr, parâmetros, função(erro, resultado){ res.json(resultado) }) })); aplicativo.ouvir(3000, () => console.registro('Listening on port 3000' (Escutando na porta 3000))); função runAsync (retorno de chamada) { retorno função (req, res, próxima) { retorno de chamada(req, res, próxima) .captura(próxima) } } var agrupamento = novo couchbase.Aglomerado("couchbase://localhost", { nome de usuário: "Administrador", senha: "Administrador" }); var balde = agrupamento.balde("amostra de viagem"); var coleção = balde.defaultCollection(); var getDoc = assíncrono (chave) => { var resultado = aguardar coleção.obter(chave); console.registro(resultado) retorno resultado } } principal(); |
Conclusão
Há muitas novas direções que você pode tomar nesse projeto. Para começar, talvez queira incluir a captura adequada de erros, informações de log de saída para o console ou usar o results.rows
para criar resultados tabulares.
Eu o incentivaria a aprofundar-se na documentação do Couchbase sobre o uso de consultas do SDK do Node.js.
Fique por dentro do restante da série de instruções sobre Node.js + Couchbase:
-
- Como começar a usar o SDK do Node.js para o Couchbase
- Como criar chamadas Get/Upsert assíncronas com o Node.js e o Couchbase
- Crie um aplicativo baseado em REST com Node.js, Express e Couchbase
- Como consultar dados JSON usando SQL++ para Node.js e Couchbase
- Como adicionar a funcionalidade de pesquisa de texto completo ao seu aplicativo JavaScript