Solucionado (ver solução)
Solucionado
(ver solução)
15
respostas

6. Publish e Subscribe

Estou seguindo o curso e resolvi fazer um teste, mantive o insert e o remove no client mesmo após eu ter removido o autopublish, funcionou normalmente, a única coisa que não funcionou foi o find, é isso mesmo?

O que eu entendi pelo vídeo é que não funcionaria dessa forma, e que deveria obrigatoriamente usar os methods.

15 respostas

Oi Pedro,

Vc fez o insert pelo inspector e funcionou?

Um abraço

Oi Maurício,

Eu removi autopublish como no vídeo, e mantive a linha Tarefas.insert({nome: nome, data: new Date()}); no arquivo novo.js, pensei que não funcionaria, e que deveria obrigatoriamente usar Meteor.call("adiciona", {nome: nome});, mas funcionou normalmente.

Após eu ter removido o autopublish do meteor, a execução de comandos do mongo pelo inspector ainda está sendo realizada normalmente. Há mais alguma outra configuração que precisa ser feita?

Oi Pedro, ja descobriu o que houve?

Olá Flavinho, ainda não, provavelmente o que aconteceu comigo seja a mesma situação do Kleber.

solução!

Pois é Pedro, dei uma olhada no site do meteortips:

http://meteortips.com/first-meteor-tutorial/publish-subscribe/

Ele ele também diz que para desligar o autopublish fazemos:

meteor remove autopublish

Pelo o que eu entendi, os comando de insert, etc não darão erro, simplesmente não sincronizarão com o banco. Posso estar enganado, mas se for isso, será essa a razão da confusão?

Então Flavio, se e não estiver enganado gravou no banco, outra hora refaço os testes, no momento estou meio sem tempo.

Mas obrigado pela atenção.

Pedro, sem o autopublish o meteor vai apenas gravar no minimongo, porém não vai sincronizar com o mongodb, e foi por isso que a função find não funcionou. Tanto é que se você tentar rodar no console do browser Tarefas.insert() ele vai retornar um string de _id, porém vai gerar um erro de access denied (ou mensagem parecida), ou seja, não vai persistir no MongoDB.

Pedro, você só vai conseguir utilizar as funções de insert,update,remove sem o autopublish somente se sua model estiver rodando a função, exemplo:

Tarefas.allow({
    insert: function() {
        return true;
    },
    update: function() {
        return true;
    },
    remove: function() {
        return true;
    }
});

eae nesse caso, seria a mesma coisa de usar o autopublish.

Olá pessoal, tudo bem?

O meu tb continuou funcionando o insert e delete via inspetor do browser. Mesmo após desativar o autopublish. E o pior é que ele está persistindo no MongoDB.

Outra coisa, os métodos também são públicos, ou seja, também podem ser chamados via inspetor...

Realmente não entendi esse lance de autopublish. Muito menos a solução utilizando os métodos.

Marcelo e todo mundo dessa discussão, ocorreu um engano aqui, peço desculpas pela confusão.

Não é o autopublish o responsável por barrar as ações de escrita e sim o package insecure.

O autopublish basicamente cria automático um Meteor.publish/Meteor.subscribe para cada função Collection.find que você realizar no client-side.

O insecure é o responsável por barrar ações de escrita (insert, delete e update) no client-side, recomendando que utilize o Meteor.methods pois nele é possível tratar no server-side os dados de entrada.

De qualquer forma, é obrigatório que ambos não sejam usados em ambiente de produção. Então sempre que criar um novo projeto meteor, rode:

meteor remove insecure autopublish

Abs!

Bacana Caio agora sim só funciona o insert via os métodos. Porém ainda podemos chamar os métodos pelo inspetor do browser. Existe alguma estrategia para dificultar isso?

Marcelo, chamar os métodos pelo browser esta correto, afinal se não chamar eles, não terá interação frontend com backend.

O motivo de substituir ações de escrita do mongo por methods é que as chamadas de escritas vão diretamente para o MongoDB e os methods passam primeiro no backend meteor permitindo que você valide campos, lance erros, salve em inúmeras coleções do mongodb, envie emails, faça o que você quiser, de forma controlada e isolada restritamente no backend, ou seja, é como se vc estivesse criando um controller do MVC.

Sem o insecure as chamadas do MongoDB no browser retornarão access denied, somente as chamadas no Meteor.methods() serão permitidas.

Entendi Caio, muito obrigado pelo feedback.

Abraços,

Opa eu que agradeço pela compreensão devido a confusão dos nomes dos packages rsrs Tem mais coisas legais no meu livro sobre Meteor da Casa do Código, apesar dele estar desatualizado, na parte conceitual esta bem definida: https://www.casadocodigo.com.br/products/livro-meteor

Ou então acompanhe meu blog http://udgwebdev.com que tem alguns posts sobre Meteor lá!

Tenha uma ótima semana! Abs!