Há muitas maneiras de usar o Couchbase em seu aplicativo da Web ou móvel por meio de um dos vários SDKs de linguagem. No entanto, e se você não estiver usando uma linguagem de back-end como PHP ou uma linguagem móvel como Objective-C? O que acontece se você estiver usando um serviço da Web hospedado estaticamente, como o Amazon S3, em que você só tem habilidades de HTML, CSS e JavaScript?
É nesse ponto que o PouchDB pode entrar em ação. PouchDB é uma biblioteca de sincronização e armazenamento projetada para funcionar em um navegador da Web usando JavaScript. Não é necessário nenhum código de back-end ou SDKs para usar essa biblioteca com o Couchbase. O PouchDB pode assumir a função de SDK do lado do cliente e replicar os dados de e para o Couchbase Sync Gateway. Mas o PouchDB usa JavaScript básico, então o que acontece quando seu aplicativo usa AngularJS?
Vamos dar uma olhada em como envolver várias funções no PouchDB para torná-lo mais amigável ao AngularJS.
O que será necessário
Há alguns requisitos para o aplicativo que vamos criar. Veremos como obtê-los ao longo do caminho, mas aqui está uma amostra para que você saiba no que está se metendo.
- Python para executar um servidor HTTP simples ou algo semelhante
- Gateway de sincronização do Couchbase
- PouchDB 4
- AngularJS 1
- A biblioteca AngularJS UI-Router versão 0.2
- Twitter Bootstrap 3
Estabelecendo a base para nosso projeto
Antes de entrarmos no código, vamos situar a estrutura do nosso projeto e colocar todas as bibliotecas e estilos no lugar.
Em algum lugar de seu computador, crie o diretório PouchDB e adicione os seguintes diretórios na raiz:
- css
- fontes
- js
- modelos
Na raiz do seu projeto, você também deverá criar um arquivo chamado index.html e um arquivo chamado sync-gateway-config.json.
Agora precisamos fazer o download de todas as bibliotecas do nosso projeto. Começando com Twitter BootstrapFaça o download da versão mais recente e coloque todos os min.css nos arquivos css de seu projeto, todos os arquivos min.js nos arquivos js de seu projeto e todos os arquivos de fonte no diretório fontes de seu projeto.
Com o Twitter Bootstrap fora do caminho, precisamos fazer o download de AngularJS e o Roteador UI AngularJS. Depois de fazer o download dessas bibliotecas, coloque o arquivo min.js em seu projeto js diretório.
A última biblioteca a ser baixada é PouchDB. Depois de fazer o download do min.js coloque-o no arquivo js de seu projeto com todo o restante.
Obtendo o gateway de sincronização do Couchbase
Este projeto exigirá o Couchbase Sync Gateway para ser bem-sucedido. Se você não estiver familiarizado, o Couchbase Sync Gateway é um serviço intermediário que lida com o processamento de dados entre o aplicativo local (seu aplicativo AngularJS) e o Couchbase Server. Não usaremos o Couchbase Server neste exemplo, portanto o Sync Gateway atuará como nossa solução de armazenamento em memória na nuvem.
O Couchbase Sync Gateway pode ser encontrado por meio do Seção de downloads do Couchbase.
Criando nosso projeto
Agora que todos os arquivos estão no lugar, podemos começar a codificar nosso aplicativo.
Incluindo todos os scripts e estilos
Vamos começar incluindo todos os estilos e scripts em nosso index.html arquivo. Abra seu index.html e inclua o seguinte código:
1 2 |
Alguns aspectos a serem observados index.html arquivo. Nomeamos nosso aplicativo AngularJS como aplicativo de bolsa e estamos usando uma tag que pode parecer estranha:
Essa tag faz parte do AngularJS UI-Router. Este é um aplicativo de página única em que cada tela é uma parte que é carregada nessa tag. Isso fará mais sentido em breve.
Criação do arquivo lógico do AngularJS
Dentro da seção js crie um arquivo chamado app.js e inclua o seguinte código:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
angular.módulo("pouchapp", ["ui.router"]) .executar(função($bolsaDB) { }) .configuração(função($provedor de estado, $provedor de roteamento de url) { }) .controlador("MainController", função($escopo, $rootScope, $estado, $stateParams, $bolsaDB) { }) |
Algumas observações sobre esse arquivo em geral e o que vamos fazer. O arquivo app.js é onde toda a lógica do nosso aplicativo será armazenada. Nele, temos um arquivo .run() que será executada quando o aplicativo for iniciado, uma função .config() que configurará todas as telas em nosso aplicativo (UI-Router), e uma função .controlador() que conterá a lógica para a funcionalidade do nosso aplicativo específico.
Observe também $pouchDB pois esse é um serviço AngularJS que projetaremos mais tarde.
A configuração do AngularJS
Como estamos usando o AngularJS UI-Router, precisamos configurar nossas rotas no arquivo .config() função do app.js arquivo. O código seria parecido com o seguinte:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$provedor de estado .estado("lista", { "url": "/lista", "templateUrl": "templates/list.html", "controlador": "MainController" }) .estado("item", { "url": "/item/:documentId/:documentRevision", "templateUrl": "templates/item.html", "controlador": "MainController" }); $provedor de roteamento de url.caso contrário("lista"); |
Em resumo, temos duas rotas (telas) aqui. Temos uma tela para mostrar uma lista de algum tipo e uma tela que nos permite adicionar ou atualizar itens da lista. Ambas as rotas usam um controlador AngularJS chamado Controlador principalmas cada um tem um modelo diferente.
Os modelos de rota do AngularJS
Cada tela precisa de seu próprio HTML para ser exibida ao usuário. Na seção modelos diretório, crie list.html e item.html. Abra o list.html e adicione o seguinte código:
1 |
<botão classe="btn btn-primary">Novo Item</botão> |
Primeiro nome | Sobrenome | ||
---|---|---|---|
{{value.firstname}} | {{value.lastname}} | {{value.email}} | editar | excluir |
Muitas dessas coisas podem parecer malucas, mas vou explicá-las e elas devem fazer mais sentido. Em primeiro lugar, estamos criando uma tabela e fazendo um looping em um objeto, criando uma nova linha de tabela para cada iteração. Como se trata de um objeto que estamos percorrendo, ele terá uma chave e um valor, e é por isso que o separamos. O valor desse par também é um objeto, que contém informações de nome e de e-mail.
A linha com o editar e excluir está obtendo informações do objeto para excluí-lo do armazenamento ou passá-lo para uma tela diferente para que possamos editá-lo.
Agora vamos para a segunda e última rota do nosso aplicativo. Abra a rota item.html e inclua o seguinte código:
1 |
Essencialmente, isso é apenas um formulário. Temos uma função de salvamento que veremos na próxima seção sobre controladores AngularJS.
O serviço AngularJS do PouchDB
Antes de prosseguirmos, precisamos falar sobre o serviço AngularJS para o PouchDB. Caso contrário, todo o resto não fará sentido. Estamos criando um serviço porque queremos que as coisas sejam compatíveis com o AngularJS no PouchDB. Queremos ter interfaces reativas, entre outras coisas. No final do app.js adicione o seguinte 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 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
.serviço("$pouchDB", ["$rootScope", "$q", função($rootScope, $q) { var banco de dados; var changeListener; este.setDatabase = função(databaseName) { banco de dados = novo PouchDB(databaseName); } este.startListening = função() { changeListener = banco de dados.mudanças({ ao vivo: verdadeiro, incluir_docs: verdadeiro }).em("mudança", função(mudança) { se(!mudança.excluído) { $rootScope.$transmissão("$pouchDB:change", mudança); } mais { $rootScope.$transmissão("$pouchDB:delete", mudança); } }); } este.stopListening = função() { changeListener.cancelar(); } este.sincronização = função(banco de dados remoto) { banco de dados.sincronização(banco de dados remoto, {ao vivo: verdadeiro, tentar novamente: verdadeiro}); } este.salvar = função(jsonDocument) { var diferido = $q.adiar(); se(!jsonDocument._id) { banco de dados.postagem(jsonDocument).então(função(resposta) { diferido.resolver(resposta); }).captura(função(erro) { diferido.rejeitar(erro); }); } mais { banco de dados.colocar(jsonDocument).então(função(resposta) { diferido.resolver(resposta); }).captura(função(erro) { diferido.rejeitar(erro); }); } retorno diferido.promessa; } este.excluir = função(documentId, documentRevision) { retorno banco de dados.remover(documentId, documentRevision); } este.obter = função(documentId) { retorno banco de dados.obter(documentId); } este.destruir = função() { banco de dados.destruir(); } }]); |
É muita coisa para entender. Basicamente, estamos apenas encapsulando muitas das funções do PouchDB. No entanto, o que mais importa aqui é a função startListening e salvar funções.
Dentro do startListening estamos ouvindo as alterações e transmitindo-as pelo aplicativo usando a função $rootScope.$broadcast. Embora você ainda não tenha visto isso, o AngularJS pode captar essas transmissões usando $rootScope.$on. Isso facilita muito a alteração da interface do usuário.
Em termos de salvar estamos verificando se um ID de documento foi passado para nós. Se nenhum ID de documento tiver sido passado, significa que se trata de um novo documento a ser inserido; caso contrário, trata-se de uma atualização.
Voltando à nossa função Controller and Run
Vamos começar com o AngularJS .run() porque ela é curta. Adicione o seguinte código:
1 2 3 4 5 6 |
.executar(função($bolsaDB) { $bolsaDB.setDatabase("nraboy-test"); $bolsaDB.sincronização("http://localhost:4984/test-database"); }) |
Aqui, nomeamos o banco de dados local e informamos que queremos sincronizar com esse local remoto que, na verdade, é o nosso Couchbase Sync Gateway. Essa sincronização acontece continuamente depois que a chamamos. Por contínua, quero dizer que as alterações serão replicadas entre o aplicativo e o servidor enquanto o aplicativo estiver aberto.
Passando para o código do controlador, adicione o seguinte:
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 |
.controlador("MainController", função($escopo, $rootScope, $estado, $stateParams, $bolsaDB) { $escopo.itens = {}; $bolsaDB.startListening(); $rootScope.$em("$pouchDB:change", função(evento, dados) { $escopo.itens[dados.doc._id] = dados.doc; $escopo.$aplicar(); }); $rootScope.$em("$pouchDB:delete", função(evento, dados) { excluir $escopo.itens[dados.doc._id]; $escopo.$aplicar(); }); se($stateParams.documentId) { $bolsaDB.obter($stateParams.documentId).então(função(resultado) { $escopo.inputForm = resultado; }); } $escopo.salvar = função(primeiro nome, sobrenome, e-mail) { var jsonDocument = { "firstname": primeiro nome, "lastname" (sobrenome): sobrenome, "email": e-mail }; se($stateParams.documentId) { jsonDocument["_id"] = $stateParams.documentId; jsonDocument["_rev"] = $stateParams.documentRevision; } $bolsaDB.salvar(jsonDocument).então(função(resposta) { $estado.ir("lista"); }, função(erro) { console.registro("ERROR -> " + erro); }); } $escopo.excluir = função(id, rev) { $bolsaDB.excluir(id, rev); } }) |
O aplicativo já está sendo sincronizado, portanto, precisamos ouvir as alterações. Aqui está o $rootScope.$on Eu mencionei anteriormente. Temos dois deles porque em um estamos ouvindo alterações (criação ou atualização) e no outro estamos ouvindo exclusões.
Se o list.html Se a página nos encaminhou até aqui para uma atualização, então teremos um ID de documento passado. Nesse cenário, podemos fazer uma pesquisa e obter os dados desse ID de documento específico para exibir no formulário, em vez de deixá-lo em branco, que é o padrão.
Finalmente, temos nosso salvar e excluir funções.
Configuração do Sync Gateway
O PouchDB e o AngularJS são apenas a metade da história aqui. É claro que eles criarão um bom aplicativo executado localmente, mas queremos que as coisas sejam sincronizadas. O Couchbase Sync Gateway é nosso ponto de extremidade para isso e, é claro, o PouchDB funciona muito bem com ele.
Dentro da seção sync-gateway-config.json adicione o seguinte:
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 |
{ "log":["CRUD+", "REST+", "Mudanças+", "Anexar+"], "bancos de dados": { "banco de dados de teste": { "servidor":"walrus:data", "sync":` função (doc) { canal (doc.canais); } `, "usuários": { "CONVIDADO": { "desativado": falso, "admin_channels": ["*"] } } } }, "CORS": { "Origem": ["http://localhost:9000"], "LoginOrigin": ["http://localhost:9000"], "Headers" (Cabeçalhos): ["Content-Type"], "MaxAge": 17280000 } } |
Essa é uma das configurações mais básicas existentes. Algumas observações sobre ela:
- Ele usa walrus:data para armazenamento, que fica na memória e não persiste. Não deve ser usado para produção.
- Todos os dados são sincronizados por meio do usuário GUEST, portanto, não há autenticação acontecendo aqui, mas poderia haver
- Estamos corrigindo problemas de CORS ao permitir solicitações em localhost:9000
Testando o aplicativo
Neste ponto, todo o nosso código está no lugar e o Sync Gateway está pronto para ser executado. Inicie o Sync Gateway executando o seguinte em um prompt de comando ou terminal:
1 |
/caminho/para/sincronização/portal/caixa/sincronização-portal /caminho/para/projeto/sincronização-portal-configuração.json |
É aqui que o Python entra em ação. Não é possível simplesmente abrir os arquivos HTML em um navegador da Web. Eles devem ser servidos para evitar problemas de CORS. No prompt de comando ou terminal, com o projeto como seu diretório de trabalho atual, execute o seguinte:
1 |
python -m Servidor SimpleHTTPS 9000 |
Acesse http://localhost:9000 em seu navegador da Web e confira!
Conclusão
Agora você viu como criar um aplicativo da Web que pode ser sincronizado com o Couchbase usando nada mais do que AngularJS e PouchDB. Não foram necessários SDKs de back-end.
Você pode obter o código-fonte completo desta postagem do blog por meio de nosso Repositório do GitHub do Couchbase Labs.
O N1QL suportará a união de dois compartimentos em algum campo comum? Tenho dois compartimentos, e os documentos em ambos os compartimentos têm o campo acct_id. Posso unir os dois compartimentos com base no acct_id para obter o resultado?
Obrigado por esse ótimo tutorial.
Senhor, eu gostaria de usar off-line
como o PouchDB para armazenar e recuperar imagens, e eu tenho
Estou lutando com ele há algum tempo. Segui o site inicial do PouchDB, mas não consegui salvar uma única foto nele
E eu ficaria muito grato se você pudesse me ajudar com uma ilustração simples.
Muito obrigado
Por que não converter suas imagens em strings base64 e armazenar as strings?
Ok, senhor. Deixe-me fazer isso.
Obrigado.
Conforme aconselhado, usei o angular.tojson nos dados de imagem da câmera e armazenei o resultado no pouchdb.
No entanto, tentei recuperar a imagem e exibi-la, mas sem sucesso. A imagem faz parte de uma matriz de objetos com um nome de referência. Embora eu use ng-repeat para percorrer o objeto e extrair o nome e a data de nascimento, não sei como converter a imagem de volta à sua forma original no campo de expressão, ou seja, {{}}
Obrigado, senhor.
Quando você diz câmera, se estiver falando do Ionic Framework, já viu isso?
https://blog.nraboy.com/2014/0…
Mais especificamente, há esta linha no exemplo:
Para exibir uma imagem base64, você precisa atribuir seu HTML
imagem
tag \"data:image/jpeg;base64\", caso contrário a tag não entenderá os dados que você está passando:Espero que isso ajude.
Melhor,
Nic, obrigado pelo tutorial do blog. Seu estilo de codificação do controlador é diferente do que aprendi e gostaria de saber se você poderia me ajudar a adicionar outro link de página ao aplicativo. Tentei copiar e duplicar seu controlador e não funcionou. Obrigado
Nic, estou tendo dificuldades para sincronizar com \"sync gateway\" de volta ao meu servidor Couchbase. Você tem alguma dica? Tenho um erro que diz que meu \"cors\" não está ativado. Poderia ser esse o motivo?
Pode ser, mas isso geralmente é um problema baseado no navegador.
Forneça mais detalhes sobre a sua configuração e o que está acontecendo. Quanto mais informações eu tiver, melhor poderei ajudar.
Melhor,
Nic, usei principalmente o código de acordo com suas instruções. Minha configuração é o desenvolvimento de um aplicativo PouchDB angular para Couchbase no meu MS Surface Pro 3, que é meu dispositivo de desenvolvimento. Meu servidor Couchbase está em nosso servidor do Office. A maior parte do meu desenvolvimento é feita quando estou na mesma rede que o servidor CouchBase e o objetivo principal é que meu programa funcione em campo com conectividade limitada com o servidor do escritório. Obrigado pela atenção
Desculpe-me pela resposta tardia, eu estava de férias no feriado.
Estou um pouco confuso com as informações que você me deu. Você pode esclarecer algumas coisas?
1. O aplicativo da Web (PouchDB, Angular, etc.) está em execução no seu Surface Pro?
2. O Couchbase Sync Gateway está sendo executado no seu Surface Pro ou no servidor do escritório?
3. Seu Couchbase Server está atrás de um firewall? Em outras palavras, independentemente de onde o Sync Gateway esteja hospedado, ele tem permissão de firewall para acessar o Couchbase Server?
Melhor,
1. o aplicativo será executado em nossos supervisores (30 deles) em laptops e surface pro\s.
2. O Couchbase e o gateway de sincronização estão no servidor do escritório.
3. sim, temos permissões para acessar o servidor CouchBase.
Acho que já está quase tudo configurado, mas estou recebendo este erro? \"400 nome de banco de dados ilegal: TCS-Mobile\"
TCS-Mobile é o nome correto da minha caçamba.
Esse erro ocorre por meio do Sync Gateway ou dos logs do console do aplicativo da Web?
registros do console.
Posso solicitar que você siga exatamente o meu tutorial? Meu palpite é que você tem algo personalizado em sua configuração que pode não estar correto.
Você também pode dar uma olhada nisso:
https://www.youtube.com/watch?…
Atenciosamente,
Oi Nic,
Você parece ter uma maneira de tornar o complexo compreensível.
Estou começando como "proprietário do produto" (scrum) e ainda não tenho minha equipe de TI. Criaremos um aplicativo móvel (não nativo) e um aplicativo de navegador da Web para trabalhar com o servidor Couchbase.
"É nesse ponto que o PouchDB pode entrar em ação. O PouchDB é uma biblioteca de sincronização e armazenamento projetada para funcionar em um navegador da Web usando JavaScript."
O Couchbase Lite/Mobile pode funcionar em um navegador da Web usando JavaScript de forma semelhante ao que foi feito com o PouchDB?
Muito obrigado,
Jim
PS. Eu deveria ter mencionado que não preciso de recurso off-line para o aplicativo da Web.
Você já viu isso?
http://www.couchbase.com/cros…
Ótimo tutorial, estou no meio de um primeiro projeto off-line no momento, então isso é perfeito. No entanto, estou tendo alguns problemas com o CORS. Acabei pegando seu código do Github para garantir que não tivesse nenhum erro de digitação bobo, mas os problemas ainda persistem.
Estou usando o Chrome em um Mac.
Quando inicio o gateway de sincronização, recebo o seguinte:
MacBook-Pro:~ leigh$ couchbase-sync-gateway/bin/sync_gateway Dropbox/wwwroot/offlinefirst/sync-gateway-config.json
19:52:18.109745 Habilitando o registro: [CRUD+ REST+ Changes+ Attach+]
19:52:18.109826 ==== Couchbase Sync Gateway/1.0.4(34;04138fd) ====
19:52:18.109840 Configurou o Go para usar todas as 8 CPUs; setenv GOMAXPROCS para substituir isso
19:52:18.109858 Abrindo db /test-database como bucket \"test-database\", pool \"default\", servidor
19:52:18.109893 Abrindo o banco de dados test-database do Walrus em
19:52:18.110497 Changes+: Notificando que \"test-database\" foi alterado (keys=\"{_sync:user:}\") count=2
19:52:18.110505 Redefinir usuário convidado para configuração
19:52:18.110516 Iniciando o servidor de administração em 127.0.0.1:4985
19:52:18.113169 Iniciando o servidor em :4984 ...
2016/01/25 19:52:20 Walrus: Warning: Não foi possível salvar o bucket da morsa: open data/walrustemp741838838: no such file or directory
e, no navegador, obtenho o seguinte:
XMLHttpRequest não pode ser carregado http://localhost:4984/test-database/?_nonce=1453751478847. Um curinga \'*\' não pode ser usado no cabeçalho \'Access-Control-Allow-Origin\' quando o sinalizador de credenciais é verdadeiro. Portanto, a origem \'http://localhost:9000\' não tem permissão de acesso.
pouchdb-4.0.1.min.js:9 Erro do PouchDB: o banco de dados remoto parece não ter o CORS ativado. Para corrigir isso, ative o CORS: http://pouchdb.com/errors.html…
Interessante!
Você se certificou de servir seu projeto AngularJS em vez de apenas abrir o arquivo de índice por meio do Finder? Se você está servindo seu projeto e está tentando usá-lo via localhost:9000, pode me dizer qual versão do Sync Gateway você está usando?
Melhor,
Obrigado por responder, Nic,
Tentei usar o Sync Gateway 1.0.4 e 1.1 e também alternei entre o Pouch 4.0.1 e o Pouch 5.2.0 sem sorte. Definitivamente, também executei o projeto usando o servidor Python. No final, segui seu tutorial do YouTube ( https://www.youtube.com/watch?... que teve uma alteração muito pequena no arquivo sync-gateway-config.json em comparação com este tutorial.
Quando usei \'walrus:data\' de acordo com este tutorial, tive o problema de CORS, mas quando segui o tutorial do YouTube e usei \"server\":\"http://localhost:8091\", tudo ficou bem.
Pelo menos estou funcionando agora!
Uma última pergunta: isso deve lidar com a sincronização bidirecional como está? Terei um aplicativo Electron, um aplicativo móvel e um aplicativo da Web, todos sincronizados com o banco de dados Couchbase, portanto, precisarei que cada PouchDB faça push e pull
O sincronização no serviço $pouchDB manipulará a sincronização bidirecional.
Em meu vídeo, usei localhost:8091 porque o conectei à minha instância ativa do Couchbase Server. Neste artigo, eu tinha o Sync Gateway configurado para usar o armazenamento temporário walrus somente para desenvolvimento. É estranho que os problemas de CORS tenham desaparecido quando você mudou para o Couchbase Server, mas estou feliz por você ter conseguido fazê-lo funcionar.
Se você ainda não o fez, não se esqueça de pesquisar o tutorial do Electron que fiz e que complementa esta postagem.
Melhor,
Continuo recebendo um erro CORS ao tentar sincronizar um banco de dados PouchDB. Tentei o sync-gateway-config.json acima e a versão encontrada nos documentos do Couchbase Sync Gateway aqui:
http://developer.couchbase.com…
Em ambos os casos, recebo o seguinte erro:
XMLHttpRequest não pode ser carregado http://localhost:4985/test-database/.
Nenhum cabeçalho \'Access-Control-Allow-Origin\'está presente na solicitação
recurso. Portanto, a origem \'http://localhost:3000\' não é
acesso permitido.
Publiquei esse problema no StackOverflow, mas ninguém tentou enviar uma resposta ainda.
http://stackoverflow.com/quest…
Presumo que você esteja usando o seguinte:
Seu erro diz que você está tentando acessar pela porta 3000. Você alterou a porta na seção CORS do Sync Gateway de 9000 para 3000?
Melhor,
Obrigado por entrar em contato comigo. Eu consegui. No meu arquivo sync-gateway-config.json, tanto \"Origin\" quanto \"Login Origin\" estão definidos para a porta 3000. Estou preso no momento e não tenho certeza do que mais posso tentar. A pergunta que postei no Stack Overflow também ainda não tem respostas.
Enviei um e-mail para nossa equipe móvel. Eles devem dar continuidade a esta postagem em breve. Pessoalmente, não vejo o que pode estar errado, mas eles podem ter uma perspectiva diferente.
Melhor,
Parece que você está tentando acessar a porta de administração do Sync Gateway, que não é compatível com CORS, até onde sei. Você já tentou direcionar para a porta pública (4984)?
Esse era o problema. Por algum motivo, eu estava usando o 4985. Não sei bem o motivo. Obrigado por sua ajuda.
Oi Nic, ótimo tutorial!!!
Como você integraria o \"PouchDB\" com o Spring Framework? Assim, você pode usar o Spring Security, outras bibliotecas Java e expor uma API Restful (talvez apenas um wrapper fictício sobre o Couchbase). Meu objetivo principal é ter um cliente AngularJs com autonomia off-line e recursos de sincronização automática, mas como tenho muitos módulos escritos em Java e preciso integrar outras bibliotecas, adoraria combinar tudo isso com um aplicativo Spring Framework no backend.
Também li seu tutorial http://www.couchbase.com/deve... , mas não sei qual é a melhor abordagem para integrá-lo ao PouchDB.
Qualquer conselho ou sugestão será muito apreciado.
Obrigado,
Olá @delkan@delkant:disqus,
E se você usasse o PouchDB como modelo em sua configuração MVC, em que o PouchDB e o Sync Gateway são responsáveis por todos os dados? Então, você poderia manter seu aplicativo Java existente para processamento e renderização de lógica.
Se você precisar de mais integração, o Couchbase Sync Gateway tem uma API RESTful com a qual você pode se comunicar por meio do seu código Java. Você também pode gerenciar a autenticação personalizada com o Sync Gateway e seu servidor Java.
Isso pode me ajudar a obter uma história mais específica sobre as coisas que você está tentando fazer.
Melhor,
Na verdade, é uma boa ideia e funciona para mim, mas prefiro usar a segurança do Spring porque já tenho todos os meus usuários nela. No passado, usei esse proxy http( https://github.com/mitre/HTTP-... ) para proteger as solicitações http do solr\ com o spring-security, acabei de executar um teste com o Sync Gateway também, de modo que somente os usuários autenticados pelo Spring-security pudessem acessar o gateway. Funcionou muito bem! Outra coisa de que gosto aqui é que posso expor apenas no nível do bucket (com base na url), tudo isso usando o Spring Security e na mesma porta em que meu aplicativo está, apenas definindo um novo ponto final para atender ao gateway de sincronização do Cloudbase.
Oi Nic,
Mais uma vez, bom tutorial. Tenho uma dúvida.
De acordo com a documentação do PouchDB https://pouchdb.com/adapters.h…
O suporte ao Couchbase Sync Gateway **está em andamento**. Ele funcionará, mas você poderá ter problemas, especialmente com anexos.
Como o suporte está em andamento, gostaria de saber se é possível usar o PouchDB Server com o Couchbase. Não encontrei documentação sobre isso, mas como os dois bancos de dados são implementados usando um protocolo semelhante ao CouchDB, talvez eles sejam compatíveis. Você poderia confirmar isso?
Você sempre precisa de um Sync Gateway ou algo como o PouchDB Server para acessar um banco de dados do tipo couchdb a partir do PouchDB?
Sou novo no assunto, portanto, desculpe-me se minhas perguntas não fizerem sentido para você.
Muito obrigado,
Estou recebendo um erro quando uso o código de exemplo. O controlador configura ouvintes sempre que a exibição de lista é carregada e isso causa o erro abaixo:
pouchdb.js:141 (node) warning: possible EventEmitter memory leak detected. 11 ouvintes adicionados. Use emitter.setMaxListeners() para aumentar o limite.
Não sou um ninja do Angular, mas acho que essa parte do código precisa ser movida para um serviço.
Olá, senhor!
Eu queria desenvolver o aplicativo acima com o CouchDB em vez do Couchbase? É a mesma coisa que acima? Qual deles é preferível, mas estou procurando principalmente o CouchDB? ou preciso fazer alguma modificação no código acima? Você pode fornecer algum link ou recurso para desenvolver com o CouchDB?
Desde já, obrigado.
Você terá muito mais facilidade com o Couchbase. Ele é mais rico em recursos e mais fácil de usar.
Preciso desenvolver um aplicativo de PDV que fique off-line e sincronize os dados quando o usuário tiver acesso à Internet. Quero saber como o couchbase lida com os estados conflitantes. Por exemplo, se houve uma venda na estação 1 do PDV para o item A. O cliente veio com duas quantidades do item A. Ao mesmo tempo, a estação 1 estava off-line e os dados locais mostravam apenas uma quantidade restante do item A. Mas, na verdade, o gerente de vendas estava off-line. Ao mesmo tempo, a estação 1 estava off-line e os dados locais mostravam apenas uma quantidade restante do item A. Mas, na verdade, o gerente de vendas havia reabastecido o estoque há algum tempo, quando a estação 1 estava off-line, o que significa que o reabastecimento do estoque não será exibido na estação 1 até que o banco de dados entre em sincronia. Minha pergunta é: como esse cenário será tratado nos estados de banco de dados off-line/on-line?
O histórico de revisões é mantido sempre que um documento é alterado. Assim, por exemplo, quando você salva seu documento pela primeira vez, ele pode ter a seguinte aparência:
1-ad2348fd
Onde 1 é a revisão e o restante é o hash associado ao salvamento.
Se você tiver um documento que compartilha o mesmo ID e o mesmo número de revisão, mas hashes diferentes, será fornecido um indicador de conflito. Nesse ponto, você pode consultar o histórico de revisões do documento, ou seja, examinar as duas entradas de revisão com a mesma profundidade (ou mais profunda) e aplicar sua lógica de negócios para ver qual delas deve ser salva.
Se você se deparar com o cenário em que um dispositivo acaba com um número de histórico de revisão maior, ou seja, o dispositivo off-line salvou 100 vezes, o dispositivo que salvou a revisão mais alta vencerá sem conflito. No entanto, você sempre pode examinar o histórico de revisões e aplicar mais lógica comercial.
Isso responde à sua pergunta?
Melhor,
Não completamente. No cenário que forneci, tive um problema quando a estação off-line recebeu um pedido de venda (2 itens do produto A) muito maior do que o estado do banco de dados local (apenas 1 item restante do produto A). Nesse cenário, como a transação de vendas pode ser realizada enquanto a estação (aplicativo de postagem) estiver no modo off-line? A única solução de negócios que consegui pensar é entrar em itens negativos durante o período em que o aplicativo estiver off-line, pois 1-2 = -1; e, assim que a Internet estiver disponível, sincronizo o estado e gerencio os conflitos, como você disse.
Realmente não tenho certeza do que você está dizendo. Quer tentar novamente?
Oi Nic,
Ótimo tutorial. Muito bem explicado.
Gostaria de salientar que, ao injetar o roteador de interface do usuário do AngularJs, em app.js, injete ["ui.router"] em vez de ["ui-router"] para evitar o erro injectormodulerr.
Mais uma vez, obrigado
Oi Nic,
Minhas desculpas, fui eu quem leu errado. Você havia injetado corretamente.
Agora que o SyncGateway não é compatível com o protocolo de replicação do CouchDB, esse tutorial parece não ser válido.
https://developer.couchbase.com/documentation/mobile/2.0/references/couchbase-lite/release-notes/index.html#deprecation-notices