Meteor - Guia Rápido

De acordo com a documentação oficial da Meteor -

O Meteor é uma plataforma JavaScript full-stack para o desenvolvimento de aplicativos móveis e da web modernos. O Meteor inclui um conjunto chave de tecnologias para a construção de aplicativos reativos de cliente conectado, uma ferramenta de construção e um conjunto curado de pacotes da comunidade Node.js e JavaScript geral.

Características

  • Web and Mobile - O Meteor oferece uma plataforma para o desenvolvimento de aplicativos Web, Android e IOS.

  • Universal Apps - O mesmo código para navegadores da web e dispositivos móveis.

  • Packages - Grande número de pacotes fáceis de instalar e usar.

  • Meteor Galaxy - Serviço de nuvem para implantação de aplicativo Meteor.

Vantagens

  • Os desenvolvedores precisam apenas de JavaScript para o desenvolvimento do lado do servidor e do cliente.
  • A codificação é muito simples e amigável para iniciantes.
  • Os aplicativos Meteor são em tempo real por padrão.
  • Os pacotes oficiais e da comunidade economizam muito tempo.

Limitações

  • O Meteor não é muito adequado para aplicações grandes e complexas.

  • Há muita mágica acontecendo ao trabalhar com o Meteor, então os desenvolvedores podem se sentir limitados de alguma forma.

Neste capítulo, aprenderemos como instalar o Meteor no sistema operacional Windows. Antes de começarmos a trabalhar com o Meteor, precisaremosNodeJS. Se você não o instalou, pode verificar os links fornecidos abaixo.

Pré-requisito

NodeJS é a plataforma necessária para o desenvolvimento do Meteor. Se você não tem o ambiente NodeJS pronto, então você pode verificar nossoNodeJS Environment Setup.

Instale o Meteor

Baixe o instalador oficial do meteoro desta página

Se ocorrer algum erro durante a instalação, tente executar o instalador como administrador. Assim que a instalação for concluída, você será solicitado a criar uma conta Meteor.

Quando terminar de instalar o instalador Meteor, você pode testar se tudo está instalado corretamente executando o seguinte código na janela do prompt de comando.

C:\Users\username>meteor

A seguir será o resultado -

Neste capítulo, aprenderemos como criar seu primeiro aplicativo Meteor.

Etapa 1 - Criar o aplicativo

Para criar o aplicativo, vamos executar o meteor createcomando na janela do prompt de comando. O nome do aplicativo serámeteorApp.

C:\Users\username\Desktop\Meteor>meteor create meteorApp

Etapa 2 - execute o aplicativo

Podemos executar o aplicativo digitando o meteor comando.

C:\Users\username\Desktop\meteorApp>meteor

Este comando irá iniciar vários processos, que podem ser vistos na imagem a seguir.

Etapa 3 - Verifique o resultado

Agora, podemos abrir o http://localhost:3000/ endereço para ver como nosso primeiro aplicativo Meteor se parece.

Os modelos do Meteor estão usando três tags de nível superior. Os dois primeiros sãohead e body. Essas tags executam as mesmas funções do HTML normal. A terceira tag étemplate. Este é o lugar onde conectamos HTML a JavaScript.

Modelo Simples

O exemplo a seguir mostra como isso funciona. Estamos criando um modelo comname = "myParagraph"atributo. Nossotemplate tag é criada abaixo do bodyelemento, no entanto, precisamos incluí-lo antes de ser renderizado na tela. Podemos fazer isso usando{{> myParagraph}}sintaxe. Em nosso modelo, estamos usando chaves duplas({{text}}). Esta é uma linguagem de modelo de meteoro chamadaSpacebars.

Em nosso arquivo JavaScript, estamos configurando Template.myParagraph.helpers({})método que será a nossa conexão com o nosso modelo. Estamos apenas usandotext ajudante neste exemplo.

meteorApp.html

<head>
   <title>meteorApp</title>
</head>
 
<body>
   <h1>Header</h1>
   {{> myParagraph}}
</body>
 
<template name = "myParagraph">
   <p>{{text}}</p>
</template>

meteorApp.js

if (Meteor.isClient) {
   
   // This code only runs on the client
   Template.myParagraph.helpers({
      text: 'This is paragraph...'
   });
}

Depois de salvarmos as alterações, o resultado será o seguinte -

Template de Bloco

No exemplo a seguir, estamos usando {{#each paragraphs}} para iterar sobre o paragraphs matriz e modelo de retorno name = "paragraph" para cada valor.

meteorApp.html

<head>
   <title>meteorApp</title>
</head>
 
<body>
   <div>
      {{#each paragraphs}}
         {{> paragraph}}
      {{/each}}
   </div>
</body>
 
<template name = "paragraph">
   <p>{{text}}</p>
</template>

Precisamos criar paragraphsajudante. Este será um array com cinco valores de texto.

meteorApp.js

if (Meteor.isClient) {
   
   // This code only runs on the client
   Template.body.helpers({
      paragraphs: [
         { text: "This is paragraph 1..." },
         { text: "This is paragraph 2..." },
         { text: "This is paragraph 3..." },
         { text: "This is paragraph 4..." },
         { text: "This is paragraph 5..." }
      ]
   });
}

Agora, podemos ver cinco parágrafos na tela.

Neste capítulo, aprenderemos como usar MongoDB coleções.

Crie uma coleção

Podemos criar uma nova coleção com o seguinte código -

meteorApp.js

MyCollection = new Mongo.Collection('myCollection');

Adicionar Dados

Depois que a coleção é criada, podemos adicionar dados usando o insert método.

meteorApp.js

MyCollection = new Mongo.Collection('myCollection');

var myData = {
   key1: "value 1...",
   key2: "value 2...",
   key3: "value 3...",
   key4: "value 4...",
   key5: "value 5..."
}

MyCollection.insert(myData);

Encontrar dados

Podemos usar o find método de busca de dados na coleção.

meteorApp.js

MyCollection = new Mongo.Collection('myCollection');

var myData = {
   key1: "value 1...",
   key2: "value 2...",
   key3: "value 3...",
   key4: "value 4...",
   key5: "value 5..."
}

MyCollection.insert(myData);

var findCollection = MyCollection.find().fetch();
console.log(findCollection);

O console mostrará os dados inseridos anteriormente.

Podemos obter o mesmo resultado adicionando os parâmetros de pesquisa.

meteorApp.js

MyCollection = new Mongo.Collection('myCollection');

var myData = {
   key1: "value 1...",
   key2: "value 2...",
   key3: "value 3...",
   key4: "value 4...",
   key5: "value 5..."
}

MyCollection.insert(myData);

var findCollection = MyCollection.find({key1: "value 1..."}).fetch();
console.log(findCollection);

Dados de atualização

O próximo passo é atualizar nossos dados. Depois de criar uma coleção e inserir novos dados, podemos usar oupdate método.

meteorApp.js

MyCollection = new Mongo.Collection('myCollection');

var myData = {
   key1: "value 1...",
   key2: "value 2...",
   key3: "value 3...",
   key4: "value 4...",
   key5: "value 5..."
}

MyCollection.insert(myData);

var findCollection = MyCollection.find().fetch();
var myId = findCollection[0]._id;

var updatedData = {
   key1: "updated value 1...",
   key2: "updated value 2...",
   key3: "updated value 3...",
   key4: "updated value 4...",
   key5: "updated value 5..."
}

MyCollection.update(myId, updatedData);

var findUpdatedCollection = MyCollection.find().fetch();
console.log(findUpdatedCollection);

O console mostrará que nossa coleção está atualizada.

Apagar Dados

Os dados podem ser excluídos da coleção usando o removemétodo. Estamos definindoid neste exemplo, como um parâmetro para excluir dados específicos.

meteorApp.js

MyCollection = new Mongo.Collection('myCollection');

var myData = {
   key1: "value 1...",
   key2: "value 2...",
   key3: "value 3...",
   key4: "value 4...",
   key5: "value 5..."
}

MyCollection.insert(myData);

var findCollection = MyCollection.find().fetch();
var myId = findCollection[0]._id;

MyCollection.remove(myId);

var findDeletedCollection = MyCollection.find().fetch();
console.log(findDeletedCollection);

O console mostrará um array vazio.

Se quisermos excluir tudo da coleção, podemos usar o mesmo método, no entanto, em vez de id vamos usar um objeto vazio {}. Precisamos fazer isso no servidor por motivos de segurança.

meteorApp.js

if (Meteor.isServer) {

   MyCollection = new Mongo.Collection('myCollection');

   var myData = {
      key1: "value 1...",
      key2: "value 2...",
      key3: "value 3...",
      key4: "value 4...",
      key5: "value 5..."
   }

   MyCollection.insert(myData);
   MyCollection.remove({});
	
   var findDeletedCollection = MyCollection.find().fetch();
   console.log(findDeletedCollection);
}

Também podemos excluir dados usando outros parâmetros. Como no exemplo anterior, o Meteor nos forçará a fazer isso do servidor.

meteorApp.js

if (Meteor.isServer) {

   MyCollection = new Mongo.Collection('myCollection');

   var myData = {
      key1: "value 1...",
      key2: "value 2...",
      key3: "value 3...",
      key4: "value 4...",
      key5: "value 5..."
   }

   MyCollection.insert(myData);
   MyCollection.remove({key1: "value 1..."});
	
   var findDeletedCollection = MyCollection.find().fetch();
   console.log(findDeletedCollection);
}

Pode-se ver que os dados são apagados da janela de comando.

Neste capítulo, aprenderemos como trabalhar com formas Meteor.

Entrada de Texto

Primeiro, vamos criar um form elemento com campo de entrada de texto e um botão de envio.

meteorApp.html

<head>
   <title>meteorApp</title>
</head>
 
<body>
   <div>
      {{> myTemplate}}
   </div>
</body>
 
<template name = "myTemplate">
   <form>
      <input type = "text" name = "myForm">
      <input type = "submit" value = "SUBMIT">
   </form>
</template>

Em um arquivo JavaScript, vamos criar o submitevento. Precisamos evitar o comportamento do evento padrão para impedir a atualização do navegador. A seguir, vamos pegar o conteúdo do campo de entrada e atribuí-lo atextValue variável.

No exemplo a seguir, registraremos apenas esse conteúdo no console dos desenvolvedores. E a última coisa que precisamos é limpar o campo de entrada.

meteorApp.js

if (Meteor.isClient) {

   Template.myTemplate.events({

      'submit form': function(event) {
         event.preventDefault();
         var textValue = event.target.myForm.value;
         console.log(textValue);
         event.target.myForm.value = "";
      }
   });
}

Quando digitamos "Algum texto ..." em nosso campo de entrada e o enviamos, o console registrará o texto que inserimos.

Botões do rádio

Um conceito semelhante pode ser usado para botões de rádio.

meteorApp.html

<head>
   <title>meteorApp</title>
</head>
 
<body>
   <div>
      {{> myTemplate}}
   </div>
</body>
 
<template name = "myTemplate">
   <form>
      <input type = "radio" name = "myForm" value = "form-1">FORM 1
      <input type = "radio" name = "myForm" value = "form-2">FORM 2
      <input type = "submit" value = "SUBMIT">
   </form>
</template>

meteorApp.js

if (Meteor.isClient) {

   Template.myTemplate.events({

      'submit form': function(event) {
         event.preventDefault();
         var radioValue = event.target.myForm.value;
         console.log(radioValue);
      }
   });
}

Quando enviarmos o primeiro botão, o console mostrará a seguinte saída.

Caixa de seleção

O exemplo a seguir mostra como usar as caixas de seleção. Você pode ver que estamos apenas repetindo o mesmo processo.

meteorApp.html

<head>
   <title>meteorApp</title>
</head>
 
<body>
   <div>
      {{> myTemplate}}
   </div>
</body>
 
<template name = "myTemplate">
   <form>
      <input type = "checkbox" name = "myForm" value = "form-1">FORM 1
      <input type = "checkbox" name = "myForm" value = "form-2">FORM 2
      <input type = "submit" value = "SUBMIT">
   </form>
</template>

meteorApp.js

if (Meteor.isClient) {

   Template.myTemplate.events({
   
      'submit form': function(event) {
         event.preventDefault();
         var checkboxValue1 = event.target.myForm[0].checked;
         var checkboxValue2 = event.target.myForm[1].checked;
         console.log(checkboxValue1);
         console.log(checkboxValue2);
      }
   });
}

Assim que o formulário for enviado, a entrada marcada será registrada como true, enquanto o desmarcado será registrado como false.

Selecione o menu suspenso

No exemplo a seguir, aprenderemos como usar o selectelemento. Vamos usar ochange evento para atualizar os dados sempre que a opção muda.

meteorApp.html

<head>
   <title>meteorApp</title>
</head>
 
<body>
   <div>
      {{> myTemplate}}
   </div>
</body>
 
<template name = "myTemplate">
   <select>
      <option name = "myOption" value = "option-1">OPTION 1</option>
      <option name = "myOption" value = "option-2">OPTION 2</option>
      <option name = "myOption" value = "option-3">OPTION 3</option>
      <option name = "myOption" value = "option-4">OPTION 4</option>
   </select>
</template>

meteorApp.js

if (Meteor.isClient) {

   Template.myTemplate.events({

      'change select': function(event) {
         event.preventDefault();
         var selectValue = event.target.value;
         console.log(selectValue);
      }
   });
}

Se escolhermos a terceira opção, o console registrará o valor da opção.

Neste capítulo, aprenderemos como usar tag, class e idcomo um seletor de eventos. Trabalhar com eventos é bastante simples.

Vamos criar três elementos no template HTML. O primeiro ép, o segundo é myClass classe e a última é myId Eu iria.

meteorApp.html

<head>
   <title>meteorApp</title>
</head>
 
<body>
   <div>
      {{> myTemplate}}
   </div>
</body>
 
<template name = "myTemplate">
   <p>PARAGRAPH...</p>
   <button class = "myClass">CLASS</button>
   <button id = "myId">ID</button>
</template>

Em nosso arquivo JavaScript, estamos definindo três eventos para três elementos que criamos acima. Você pode ver que estamos apenas adicionandop, .myClass e #myId depois de clickevento. Estes são osselectors mencionamos acima.

meteorApp.js

if (Meteor.isClient) {

   Template.myTemplate.events({

      'click p': function() {
         console.log("The PARAGRAPH is clicked...");
      },

      'click .myClass': function() {
         console.log("The CLASS is clicked...");
      },

      'click #myId': function() {
         console.log("The ID is clicked...");
      },
   });
}

Para testar isso, podemos primeiro clicar em PARAGRAPH, então o CLASS botão e finalmente o IDbotão. Obteremos o seguinte log do console.

Podemos usar todos os outros eventos JavaScript - click, dbclick, contextmenu, mousedown, mouseup, mouseover, mouseout, mousemove - seguindo o exemplo acima.

As sessões são usadas para salvar dados enquanto os usuários usam o aplicativo. Esses dados serão excluídos quando o usuário sair do aplicativo.

Neste capítulo, aprenderemos como definir um objeto de sessão, armazenar alguns dados e retornar esses dados. Usaremos a configuração HTML básica.

meteorApp.html

<head>
   <title>meteorApp</title>
</head>
 
<body>
   <div>
      {{> myTemplate}}
   </div>
</body>
 
<template name = "myTemplate">
</template>

Agora, vamos armazenar myData usando localmente Session.set()método. Depois que o método é definido, podemos retorná-lo usandoSession.get() método.

meteorApp.js

if (Meteor.isClient) {
  
   var myData = {
      key1: "value1",
      key2: "value2"
   }

   Session.set('mySession', myData);

   var sessionDataToLog = Session.get('mySession');
   console.log(sessionDataToLog);
}

Se verificarmos o console, veremos que os dados armazenados são registrados.

No próximo capítulo, aprenderemos como atualizar os modelos automaticamente usando a variável Session.

Tracker é uma pequena biblioteca usada para atualização automática de modelos, uma vez que a variável de sessão mudou. Neste capítulo, aprenderemos como o rastreador funciona.

Primeiro, vamos criar um button que será usado para atualizar a sessão.

meteorApp.html

<head>
   <title>meteorApp</title>
</head>
 
<body>
   <div>
      {{> myTemplate}}
   </div>
</body>
 
<template name = "myTemplate">
   <button id = "myButton">CLICK ME</button>
</template>

A seguir, definiremos o valor da sessão inicial myData e criar um mySession objeto. Tracker.autorun método é usado para ficar de olho mySession. Sempre que este objeto for alterado, o modelo será atualizado automaticamente. Para testá-lo, definiremos um evento de clique para atualização.

meteorApp.js

if (Meteor.isClient) {
  
   var myData = 0
   Session.set('mySession', myData);

   Tracker.autorun(function () {
      var sessionData = Session.get('mySession');
      console.log(sessionData)
   });

   Template.myTemplate.events({

      'click #myButton': function() {
         Session.set('mySession', myData ++);
      }
   });
}

Se clicarmos no CLICK ME botão cinco vezes, veremos que o rastreador está registrando novos valores toda vez que a sessão é atualizada.

O Meteor oferece milhares de pacotes de comunidade que você pode usar enquanto desenvolve seu aplicativo.

Adicionando Pacotes

Você pode verificar o servidor oficial do pacote Meteor aqui . Basta pesquisar o pacote de que você precisa e adicioná-lo na janela do prompt de comando. Se, por exemplo, você deseja adicionarhttp pacote para o seu aplicativo, você pode fazer isso executando o seguinte código -

C:\Users\username\Desktop\meteorApp>meteor add http

Removendo Pacotes

Um princípio semelhante pode ser usado para remover pacotes -

C:\Users\username\Desktop\meteorApp>meteor remove http

Atualizando Pacotes

Você pode atualizar o pacote executando o seguinte código -

C:\Users\username\Desktop\meteorApp>meteor update http

Verificando Pacotes Atuais

Você também pode verificar quais pacotes seu aplicativo atual está usando.

C:\Users\username\Desktop\meteorApp>meteor list

Manutenção de Pacotes

Se um pacote tem : no nome, significa que é um pacote da comunidade, enquanto aqueles sem o prefixo são mantidos pelo grupo Meteor Development.

Adicionando Pacote do Grupo de Desenvolvimento Meteor

C:\Users\username\Desktop\meteorApp>meteor add http

Adicionando Pacote da Comunidade

C:\Users\username\Desktop\meteorApp>meteor add cfs:http-methods

Se você deseja limitar a execução do código apenas no servidor ou no cliente, pode usar o seguinte código -

meteorApp.js

if (Meteor.isClient) {
   // Code running on client...
}

if (Meteor.isServer) {
   // Code running on server...
}

Você pode limitar a execução do código apenas quando o aplicativo estiver usando o agrupamento Cordova.

if (Meteor.isCordova) {
   // Code running on Cordova...
}

Alguns plug-ins precisam esperar até que o servidor e o DOM estejam prontos. Você pode usar o código a seguir para esperar até que tudo comece.

Meteor.startup(function () {
   // Code running after platform is ready...
});

A tabela a seguir lista alguns outros métodos principais da API.

Sr. Não. Método e detalhes
1

Meteor.wrapAsync(function)

Usado para agrupar o código assíncrono e convertê-lo em síncrono.

2

Meteor.absoluteUrl([path], [options])

Usado para gerar URL absoluto apontando para o aplicativo.

3

Meteor.settings

Usado para definir a configuração de implantação.

4

Meteor.publish(name, function)

Usado para publicar registros para o cliente.

O método de verificação é usado para descobrir se o argumento ou os tipos correspondem ao padrão.

Instalando Check Package

Abra a janela do prompt de comando e instale o pacote.

C:\Users\username\Desktop\meteorApp>meteor add check

Usando Cheque

No exemplo a seguir, queremos verificar se myValueé uma string. Como é verdade, o aplicativo continuará sem erros.

meteorApp.js

var myValue = 'My Value...';
check(myValue, String);

Neste exemplo, myValue não é uma string, mas um número, portanto, o console registrará um erro.

meteorApp.js

var myValue = 1;
check(myValue, String);

Teste de correspondência

o Match.test é semelhante a verificar, a diferença é que quando o teste falha em vez de um erro de console, obteremos um valuesem quebrar o servidor. O exemplo a seguir mostra como testar um objeto com várias chaves.

meteorApp.js

var myObject = {
   key1 : "Value 1...",
   key2 : "Value 2..."
}

var myTest = Match.test(myObject, {
   key1: String,
   key2: String
});

if ( myTest ) {
   console.log("Test is TRUE...");
} else {
   console.log("Test is FALSE...");
}

Uma vez que ambas as chaves são strings, o teste é true. O console registrará a primeira opção.

Se mudarmos o key2 para o número, o teste falhará e o console registrará a segunda opção.

meteorApp.js

var myObject = {
   key1 : "Value 1...",
   key2 : 1
}

var myValue = 1;

var myTest = Match.test(myObject, {
   key1: String,
   key2: String
});

if ( myTest ) {
   console.log("Test is TRUE...");
} else {
   console.log("Test is FALSE...");
}

Blaze é um pacote Meteor para construir modelos reativos ao vivo.

Método de Renderização

Este método é usado para renderizar modelos no DOM. Primeiro, vamos criarmyNewTemplateque será processado. Nós também adicionaremosmyContainer, que será usado como um elemento pai, então o render método sabe onde renderizar nosso modelo.

meteorApp.html

<head>
   <title>meteorApp</title>
</head>
 
<body>
   <div id = "myContainer">
   </div>
</body>

<template name = "myNewTemplate">
   <p>Text from my new template...</p>
</template>

A seguir, criaremos uma função de renderização que receberá dois argumentos. O primeiro é um modelo que será renderizado e o segundo é um elemento pai que mencionamos acima.

meteorApp.js

Meteor.startup(function () {

   if(Meteor.isClient) {
      var myNewTemplate = Template.myNewTemplate;
      var myContainer = document.getElementById('myContainer');
      Blaze.render(myNewTemplate, myContainer);
   }
});

Renderizar com dados

Se você precisar passar alguns dados reativamente, você pode usar renderWithDatamétodo. O HTML será exatamente o mesmo do exemplo anterior.

meteorApp.html

<head>
   <title>meteorApp</title>
</head>
 
<body>
   <div id = "myContainer">
   </div>
</body>

<template name = "myNewTemplate">
   <p>Text from my new template...</p>
</template>

Podemos adicionar nossos dados como um segundo argumento em Meteor.renderWithDatamétodo. Os outros dois argumentos são iguais aos do exemplo anterior. Neste exemplo, nossos dados são uma função que registrará algum texto.

meteorApp.js

Meteor.startup(function () {

   if(Meteor.isClient) {
      var myNewTemplate = Template.myNewTemplate;
		
      var myData = function() {
         console.log('Log from the data object...')
      }

      var myContainer = document.getElementById('myContainer');
      Blaze.renderWithData(myNewTemplate, myData, myContainer);
   }
});

Método de remoção

Podemos adicionar remove método.

meteorApp.html

<head>
   <title>meteorApp</title>
</head>
 
<body>
   <div id = "myContainer">
   </div>
</body>

<template name = "myNewTemplate">
   <p>Text from my new template...</p>
</template>

Neste exemplo, estamos renderizando o modelo que será removido após três segundos. Observe oBlaze.Remove método que estamos usando para remover o modelo.

meteorApp.js

Meteor.startup(function () {

   if(Meteor.isClient) {
      var myNewTemplate = Template.myNewTemplate;
      var myContainer = document.getElementById('myContainer');
      var myRenderedTemplate = Blaze.render(myNewTemplate, myContainer);

      Meteor.setTimeout(function() {
         Blaze.remove(myRenderedTemplate);
      }, 3000);
   }
});

A tabela a seguir mostra os outros métodos que podem ser usados.

Sr. Não. Método e detalhes
1

Blaze.getData([elementOrView])

Usado para recuperar dados do elemento de renderização.

2

Blaze.toHTML(templateOrView)

Usado para renderizar templates ou visualizações para a string.

3

Blaze.toHTMLWithData(templateOrView, data)

Usado para renderizar templates ou visualizações para a string com dados adicionais.

4

new Blaze.View([name], renderFunction)

Usado para criar uma nova parte reativa Blaze do DOM.

5

Blaze.currentView

Usado para obter a visualização atual.

6

Blaze.getView([element])

Usado para obter a visualização atual.

7

Blaze.With(data, contentFunc)

Usado para construir uma visão que renderiza algum conteúdo com contexto.

8

Blaze.If(conditionFunc, contentFunc, [elseFunc])

Usado para construir uma visualização que renderiza algum conteúdo condicional.

9

Blaze.Unless(conditionFunc, contentFunc, [elseFunc])

Usado para construir uma visão que renderiza algum conteúdo condicional (invertido Blaze.if)

10

Blaze.Each(argFunc, contentFunc, [elseFunc])

Usado para construir uma visão que renderiza contentFunct para cada item.

11

new Blaze.Template([viewName], renderFunction)

Usado para construir uma nova visualização Blaze com nome e conteúdo.

12

Blaze.isTemplate(value)

Usado para retornar true, se o valor for um objeto de modelo.

Meteor oferece seu próprio setTimeout e setIntervalmétodos. Esses métodos são usados ​​para garantir que todas as variáveis ​​globais tenham valores corretos. Eles funcionam como JavaScript normalsetTimout e setInterval.

Tempo esgotado

Isto é Meteor.setTimeout exemplo.

Meteor.setTimeout(function() {
   console.log("Timeout called after three seconds...");
}, 3000);

Podemos ver no console que a função de tempo limite é chamada assim que o aplicativo é iniciado.

Intervalo

O exemplo a seguir mostra como definir e limpar um intervalo.

meteorApp.html

<head>
   <title>meteorApp</title>
</head>
 
<body>
   <div>
      {{> myTemplate}}
   </div>
</body>
 
<template name = "myTemplate">
   <button>CLEAR</button>
</template>

Vamos definir a inicial counter variável que será atualizada após cada chamada de intervalo.

meteorApp.js

if (Meteor.isClient) {

   var counter = 0;

   var myInterval = Meteor.setInterval(function() {
      counter ++
      console.log("Interval called " + counter + " times...");
   }, 3000);

   Template.myTemplate.events({

      'click button': function() {
         Meteor.clearInterval(myInterval);
         console.log('Interval cleared...')
      }
   });
}

O console irá registrar o atualizado countervariável a cada três segundos. Podemos parar isso clicando noCLEARbotão. Isso vai chamar oclearInterval método.

EJSON é uma extensão da sintaxe JSON que suporta Date e Binary tipos.

Instale EJSON

Para instalar o pacote EJSON, precisamos adicioná-lo a partir da janela do prompt de comando.

C:\Users\username\Desktop\meteorApp>meteor add ejson

Exemplo de data

Podemos desserializar o date usando o parse método.

if (Meteor.isClient) {
   var myEjsonDate = '{"$date": 1455029631493}';
   var myDate = EJSON.parse(myEjsonDate);
   console.log(myDate);
}

O console registrará o valor de data correto.

Exemplo Binário

O mesmo pode ser aplicado a tipos binários.

if (Meteor.isClient) {
   var myEjsonBinary = '{"$binary": "c3VyZS4="}';
   var myBinary = EJSON.parse(myEjsonBinary);
   console.log(myBinary);
}

Você pode ver que o console está registrando um novo valor desserializado.

Stringify

Podemos serializar um objeto usando o stringifymétodo. Este é o processo reverso do exemplo acima.

if (Meteor.isClient) {

   var myObject = {
      myDate : new Date(),
      myBinary : new Uint8Array([115, 117, 114, 101, 46])
   }

   var myEjosnData = EJSON.stringify(myObject);
   console.log(myEjosnData);
}

Podemos ver nossos novos valores no console.

Sr. Não. Método e detalhes
1

EJSON.parse(string)

Usado para analisar uma string em valor EJSON.

2

EJSON.stringify(value)

Usado para serializar um valor para a string.

3

EJSON.fromJSONValue(value)

Usado para desserializar um valor EJSON de JSON.

4

EJSON.toJSONValue(value)

Usado para serializar um valor EJSON em JSON.

5

EJSON.equals(value1, value2)

Usado para comparar se dois valores são iguais.

6

EJSON.clone(value)

Usado para retornar uma cópia profunda do valor.

7

EJSON.newBinary

Usado para atribuir dados binários que o EJSON pode serializar.

8

EJSON.isBinary(x)

Usado para verificar se o valor é um dado binário.

9

EJSON.addType(name, factory)

Usado para criar um tipo EJSON customizado.

10

customType.typeName()

Usado para retornar um nome do tipo personalizado.

11

customType.toJSONValue()

Usado para serializar tipos personalizados.

12

customType.clone()

Usado para retornar uma cópia profunda do tipo personalizado.

13

customType.equals(otherValue)

Usado para comparação entre o valor do tipo customizado e outro valor.

Este pacote fornece API de solicitação HTTP com get, post, put e delete métodos.

Pacote de instalação

Vamos instalar este pacote executando o seguinte código na janela do prompt de comando.

C:\Users\username\Desktop\meteorApp>meteor add http

Método CALL

Este é um método universal que pode usar GET, POST, PUT e DELETEargumentos. O exemplo a seguir demonstra como usarGETargumento. Os exemplos neste capítulo usarão uma API REST falsa deste site .

Você pode ver que esse método está usando quatro argumentos. Já mencionamos o primeiro argumentoGET. O segundo é o URL da API. O terceiro argumento é um objeto vazio, onde podemos definir alguns parâmetros opcionais. O último método é um retorno de chamada assíncrono, onde podemos lidar com erros e trabalhar com uma resposta.

HTTP.call( 'GET', 'http://jsonplaceholder.typicode.com/posts/1', {},
   function( error, response ) {

   if (error) {
      console.log(error);
   } else {
      console.log(response);
   }
});

Método GET

A mesma solicitação pode ser enviada usando GET ao invés de CALLmétodo. Você pode ver que o primeiro argumento agora é URL da API.

HTTP.get('http://jsonplaceholder.typicode.com/posts/1', {}, function( error, response ) {

   if ( error ) {
      console.log( error );
   } else {
      console.log( response );
   }
});

Ambos os exemplos anteriores registrarão a mesma saída.

Método POST

Neste método, estamos definindo dados que precisam ser enviados para o servidor (postData) como o segundo argumento. Todo o resto é igual ao nossoGET solicitação.

var postData = {

   data: {
      "name1": "Value1",
      "name2": "Value2",
   }
}

HTTP.post( 'http://jsonplaceholder.typicode.com/posts', postData, 
   function( error, response ) {

   if ( error ) {
      console.log( error );
   } else {
      console.log( response);
   }
});

O console irá registrar nosso postData objeto.

Método PUT

Podemos atualizar nossos dados usando o PUTmétodo. O conceito é o mesmo do nosso último exemplo.

var updateData = {

   data: {
      "updatedName1": "updatedValue1",
      "UpdatedName2": "updatedValue2",
   }
}

HTTP.put( 'http://jsonplaceholder.typicode.com/posts/1', updateData, 
   function( error, response ) {
	
   if ( error ) {
      console.log( error );
   } else {
      console.log( response );
   }
});

Agora, podemos ver nosso objeto atualizado no console.

Método DEL

Podemos enviar uma solicitação de exclusão para o servidor usando o DELmétodo. Vamos deletar tudo dentro dodata objeto.

var deleteData = {
   data: {}
}

HTTP.del( 'http://jsonplaceholder.typicode.com/posts/1', deleteData, 
   function( error, response ) {
	
   if ( error ) {
      console.log( error );
   } else {
      console.log( response );
   }
});

O console mostrará que o processo de exclusão foi bem-sucedido.

Este pacote é usado quando você precisa enviar um e-mail do aplicativo Meteor.

Etapa 1 - Adicionar pacote

Abra a janela do prompt de comando e execute o seguinte comando -

C:\Users\username\Desktop\meteorApp>meteor add email

Etapa 2 - Conta Mailgun

Precisamos criar uma conta aqui . Este é o provedor de e-mail padrão para aplicativos Meteor.

Depois de fazer login, abra o Domains guia e clique no sandbox URL abaixo de Domain Name. Vai abrir uma nova página onde podemos encontrarDefault SMTP Login e Default Password. Precisaremos desses dois para criar oMAIL_URL variável de ambiente.

Enviar email

Para criar um válido MAIL_URL basta inserir suas credenciais Mailgun no lugar de YOUR_DEFAULT_SMTP_LOGIN e YOUR_DEFAULT_PASSWORD.

if (Meteor.isServer) {

   Meteor.startup( function() {
      process.env.MAIL_URL = 
         "smtp://YOUR_DEFAULT_SMTP_LOGIN:[email protected]:587";

      Email.send({
         to: "[email protected]",
         from: "[email protected]",
         subject: "Meteor Email",
         text: "The email content..."
      });
   });
}

Ao executar o aplicativo, o e-mail será enviado para o seu endereço.

Os ativos do servidor estático estão localizados em um privatesubpasta dentro do aplicativo. No exemplo a seguir, aprenderemos como usar dados de um arquivo JSON simples.

Etapa 1 - Criar arquivos e pastas

Vamos criar um private pasta e my-json.jsonarquivo dentro dessa pasta. Faremos isso usando o seguinte comando nocommand prompt janela, no entanto, você também pode criá-lo manualmente.

C:\Users\username\Desktop\meteorApp>mkdir private

C:\Users\username\Desktop\meteorApp\private>touch my-json.json

Etapa 2 - Obter texto

Para poder ler os dados do nosso arquivo, usaremos Asssets.getTextmétodo. Observe que isso só pode ser feito do lado do servidor. Como estamos usando JSON, precisamos analisá-lo.

if (Meteor.isServer) {
   var myFile = JSON.parse(Assets.getText('my-json.json'));
   console.log(myFile.data.text)
}

A seguir será a saída na janela do prompt de comando.

Etapa 3 - Criar arquivo EJSON

Vamos criar este arquivo dentro do privatepasta. Este arquivo conterá dados binários"myBinary": {"$binary": "c3VyZS4="}

C:\Users\username\Desktop\meteorApp\private>touch my-ejson.ejson

Etapa 4 - Obtenha o binário

Para ler arquivos EJSON, podemos usar o Assets.getBinary método.

if (Meteor.isServer) {
   var myFile = Assets.getBinary('my-ejson.ejson');
   console.log(EJSON.stringify(myFile));
}

O prompt de comando registrará o valor EJSON.

Neste capítulo, aprenderemos como proteger nosso aplicativo e o que deve ser levado em consideração ao desenvolver um aplicativo.

Autopublish e Autosecure

Autopublishé um pacote que publica automaticamente todos os dados do banco de dados para o cliente. Esta é uma conveniência que deve ser desativada durante a produção. Ele pode ser desativado no prompt de comando.

C:\Users\username\Desktop\meteorApp>meteor remove autopublish

Você pode publicar alguns dados para o cliente usando Meteor.publish() e Meteor.subscribe() métodos que abordaremos no capítulo Publicar e Assinar.

Insecureé um pacote que permite que os comandos do MongoDB sejam escritos no console do desenvolvedor, para que todos os usuários do aplicativo possam acessar o banco de dados. O pacote pode ser removido executando o seguinte comando no prompt de comando.

C:\Users\username\Desktop\meteorApp>meteor remove insecure

A boa prática é remover ambos os pacotes assim que você começar a desenvolver seu aplicativo, para que você não precise alterar e atualizar seu código posteriormente.

Use métodos do lado do servidor

Você deve sempre criar seus métodos no servidor. Você pode fazer isso usando oMeteor.methods() no servidor e Meteor.call()no cliente. Aprenderemos mais sobre isso no capítulo Métodos.

Segurança Adicional

Se você deseja adicionar camadas adicionais de segurança ao seu aplicativo, você deve considerar o uso de alguns outros pacotes Meteor, como -

  • A política do navegador pode ser usada para controlar os recursos externos que devem ser carregados em seu aplicativo.

  • O pacote de verificação pode ser usado para verificar os tipos de entrada do usuário antes de serem processados.

  • A Verificação de Argumentos de Auditoria é um pacote que garantirá que todos os parâmetros sejam verificados corretamente antes de serem processados. Se você esqueceu alguns parâmetros, este pacote irá informá-lo.

  • Os pacotes Mylar podem adicionar algumas camadas adicionais de segurança. Você pode verificá-los se precisar desse tipo de proteção.

Podemos classificar os dados assim que os obtermos do banco de dados. No exemplo a seguir, vamos criarUserscoleção. Vamos usar umsort argumento ({sort: {name: 1}}) para classificar os dados de coleta por nome. O número1é usado para definir a ordem crescente. Se quisermos usar a ordem decrescente, usaríamos-1 em vez de.

Users = new Mongo.Collection('users');

Users.insert({
   name: 'James',
   email: '[email protected]',
   joined: new Date(2016, 2, 23)
});

Users.insert({
   name: 'John',
   email: '[email protected]',
   joined: new Date(2016, 2, 19)
});

Users.insert({
   name: 'Jennifer',
   email: '[email protected]',
   joined: new Date(2016, 6, 24)
});

var sortByName = Users.find({}, {sort: {name: 1}}).fetch();

var sortByEmail = Users.find({}, {sort: {email: 1}}).fetch();

var sortByJoined = Users.find({}, {sort: {joined: 1}}).fetch();

console.log(sortByName);
console.log(sortByEmail);
console.log(sortByJoined);

Podemos classificar os dados por e-mail da mesma forma.

Users = new Mongo.Collection('users');

Users.insert({
   name: 'James',
   email: '[email protected]',
   joined: new Date(2016, 2, 23)
});

Users.insert({
   name: 'John',
   email: '[email protected]',
   joined: new Date(2016, 2, 19)
});

Users.insert({
   name: 'Jennifer',
   email: '[email protected]',
   joined: new Date(2016, 6, 24)
});

var sortByEmail = Users.find({}, {sort: {email: 1}}).fetch();

console.log(sortByEmail);

Finalmente, podemos classificá-lo pela data de adesão.

Users = new Mongo.Collection('users');

Users.insert({
   name: 'James',
   email: '[email protected]',
   joined: new Date(2016, 2, 23)
});

Users.insert({
   name: 'John',
   email: '[email protected]',
   joined: new Date(2016, 2, 19)
});

Users.insert({
   name: 'Jennifer',
   email: '[email protected]',
   joined: new Date(2016, 6, 24)
});

var sortByJoined = Users.find({}, {sort: {joined: 1}}).fetch();

console.log(sortByJoined);

Este pacote permite a funcionalidade completa de autenticação do usuário. Você pode adicioná-lo executando o seguinte código na janela do prompt de comando.

C:\Users\username\Desktop\meteorApp>meteor add accounts-password

Exemplo de autenticação

Este exemplo mostrará a autenticação básica. Vamos criarregister, login, e homemodelos. Se houver umcurrentUser (se o usuário for registrado ou logado com sucesso), o homemodelo será mostrado. Se não hácurrentUser, a register e login os modelos estarão visíveis.

meteorApp.html

<head>
   <title>meteorApp</title>
</head>
 
<body>
   {{#if currentUser}}
      {{> home}}
      {{else}}
      {{> register}}
      {{> login}}
   {{/if}}
</body>

<template name = "register">
   <h2>REGISTER:</h2>
   <form>
      <input type = "email" name = "registerEmail"><br>
      <input type = "password" name = "registerPassword"><br>
      <input type = "submit" value = "Register"><br>
   </form>
</template>

<template name = "login">
   <h2>LOGIN:</h2>
   <form>
      <input type = "email" name = "loginEmail"><br>
      <input type = "password" name="loginPassword"><br>
      <input type = "submit" value = "Login"><br>
   </form>
</template>

<template name = "home">
   <p>You're logged in.</p>
   <button class = "logout">Logout</button>
</template>

Primeiro, precisamos criar um registerevento. Esta função irá ler entradas de registro, criar um novo usuário e armazená-lo no banco de dados.

O segundo evento é login. Desta vez, a função irá ler as entradas dologin template, faça o login do usuário se o email e a senha forem válidos ou retorne um erro se não forem.

E finalmente o logout O evento será usado para fazer o logout do usuário, uma vez que o botão seja clicado.

meteorApp.js

if (Meteor.isClient) {

   Template.register.events({
      'submit form': function(event) {
         event.preventDefault();

         var registerData = {
            email: event.target.registerEmail.value,
            password: event.target.registerPassword.value
         }

         Accounts.createUser(registerData, function(error) {
         
            if (Meteor.user()) {
               console.log(Meteor.userId());
            } else {
               console.log("ERROR: " + error.reason);
            }
         });
      }
   });

   Template.login.events({
   
      'submit form': function(event) {
         event.preventDefault();
         var myEmail = event.target.loginEmail.value;
         var myPassword = event.target.loginPassword.value;
			
         Meteor.loginWithPassword(myEmail, myPassword, function(error) {

            if (Meteor.user()) {
               console.log(Meteor.userId());
            } else {
               console.log("ERROR: " + error.reason);
            }
         });
      }
   });

   Template.home.events({

      'click .logout': function(event) {
         event.preventDefault();
			
         Meteor.logout(function(error) {

            if(error) {
               console.log("ERROR: " + error.reason);
            }
         });
      }
   });
}

Assim que o aplicativo for iniciado, obteremos a página a seguir.

Ao inserir o e-mail e a senha no registerformulário, podemos registrar e fazer o login do novo usuário. Veremos que o console registra os usuáriosid e a home o modelo é renderizado.

o loginO evento irá verificar o banco de dados e fazer o login do usuário, se o email e a senha estiverem corretos. Caso contrário, o console registrará um erro.

Se o usuário clicar no LOGOUT botão, o aplicativo fará o logout do usuário e mostrará o register e login modelos.

Os métodos Meteor são funções escritas no lado do servidor, mas podem ser chamadas no lado do cliente.

No lado do servidor, criaremos dois métodos simples. O primeiro adicionará 5 ao nosso argumento, enquanto o segundo adicionará10.

Usando Métodos

meteorApp.js

if(Meteor.isServer) {

   Meteor.methods({

      method1: function (arg) {
         var result = arg + 5;
         return result;
      },

      method2: function (arg) {
         var result = arg + 10;
         return result;
      }
   });
}

if(Meteor.isClient) {
   var aaa = 'aaa'
   Meteor.call('method1', aaa, function (error, result) {
	
      if (error) {
         console.log(error);
         else {
            console.log('Method 1 result is: ' + result);
         }
      }
   );

   Meteor.call('method2', 5, function (error, result) {

      if (error) {
         console.log(error);
      } else {
         console.log('Method 2 result is: ' + result);
      }
   });
}

Assim que iniciarmos o aplicativo, veremos os valores calculados no console.

Tratamento de erros

Para lidar com erros, você pode usar o Meteor.Errormétodo. O exemplo a seguir mostra como lidar com erros para usuários que não estão logados.

if(Meteor.isServer) {

   Meteor.methods({

      method1: function (param) {

         if (! this.userId) {
            throw new Meteor.Error("logged-out",
               "The user must be logged in to post a comment.");
         }
         return result;
      }
   });
}

if(Meteor.isClient) {  Meteor.call('method1', 1, function (error, result) {

   if (error && error.error === "logged-out") {
      console.log("errorMessage:", "Please log in to post a comment.");
   } else {
      console.log('Method 1 result is: ' + result);
   }});

}

O console mostrará nossa mensagem de erro personalizada.

Neste capítulo, aprenderemos como criar nosso próprio pacote de meteoros.

Criando um Pacote

Vamos adicionar uma nova pasta na área de trabalho, onde o pacote será criado. Usaremos a janela do prompt de comando.

C:\Users\username\Desktop\meteorApp> mkdir packages

Agora, podemos criar o pacote na pasta que criamos acima. Execute o seguinte comando no prompt de comando.Username é o nome de usuário do Desenvolvedor Meteor e package-name é o nome do pacote.

C:\Users\username\Desktop\meteorApp\packages>meteor create --package username:package-name

Adicionando um Pacote

Para poder adicionar um pacote local ao nosso aplicativo, precisamos definir o ENVIRONMENT VARIABLEisso dirá ao Meteor para carregar o pacote da pasta local. Clique com o botão direito no ícone do computador e escolhaproperties/Advanced system settings/Environment Variables/NEW.

Variable Name deveria estar PACKAGE_DIRS. Variable Valuedeve ser o caminho para a pasta que criamos. No nosso caso,C:\Users\username\Desktop\meteorApp\packages.

Não se esqueça de reiniciar o command prompt após adicionar uma nova variável de ambiente.

Agora podemos adicionar o pacote ao nosso aplicativo executando o seguinte código -

C:\Users\username\Desktop\meteorApp>meteor add username:package-name

Arquivos de pacote

Os quatro arquivos a seguir serão encontrados no pacote que criamos.

  • package-name-test.js
  • package-name.js
  • package.js
  • README.md

Pacote de teste (package-name-test.js)

Ofertas Meteor tinytestpacote para teste. Vamos instalá-lo primeiro usando o seguinte comando na janela do prompt de comando.

C:\Users\username\Desktop\meteorApp>meteor add tinytest

Se abrirmos package-name-test.js, veremos o exemplo de teste padrão. Usaremos este exemplo para testar o aplicativo. Nota: É sempre melhor escrever nossos próprios testes ao desenvolver pacotes de meteoros.

Para testar o pacote, vamos executar este código no prompt de comando.

C:\Users\username\Desktop>meteor test-packages packages/package-name

Obteremos o seguinte resultado.

Arquivo package.js

Este é o arquivo onde podemos escrever o código. Vamos criar algumas funcionalidades simples para nosso pacote. Nosso pacote irá registrar algum texto no console.

packages / package.js

myPackageFunction = function() {
   console.log('This is simple package...');
}

Arquivo package-name.js

Este é o arquivo onde podemos definir algumas configurações de pacote. Voltaremos a ele mais tarde, mas por agora precisamos exportarmyPackageFunctionpara que possamos usá-lo em nosso aplicativo. Precisamos adicionar isso dentroPackage.onUsefunção. O arquivo será parecido com isto.

pacotes / nome-do-pacote.js

Package.describe({
   name: 'username:package-name',
   version: '0.0.1',
   
   // Brief, one-line summary of the package.
   summary: '',
   
   // URL to the Git repository containing the source code for this package.
   git: '',
   
   // By default, Meteor will default to using README.md for documentation.
   
   // To avoid submitting documentation, set this field to null.
   documentation: 'README.md'
});

Package.onUse(function(api) {
   api.versionsFrom('1.2.1');
   api.use('ecmascript');
   api.addFiles('mypackage.js');
   api.export('myPackageFunction'); // We are exporting the function we created above...
});

Package.onTest(function(api) {
   api.use('ecmascript');
   api.use('tinytest');
   api.use('username:package-name');
   api.addFiles('package-name-tests.js');
});

Usando um Pacote

Agora podemos finalmente chamar o myPackageFunction() de nosso meteorApp.js Arquivo.

packages / package.js

if(Meteor.isClient) {
   myPackageFunction();
}

O console irá registrar o texto do nosso pacote.

Para entender melhor como o package.js arquivo pode ser configurado, usaremos o exemplo da documentação oficial do Meteor.

Este é um arquivo de exemplo ...

/* Information about this package */
Package.describe({
   
   // Short two-sentence summary.
   summary: "What this does",

   // Version number.
   version: "1.0.0",

   // Optional.  Default is package directory name.
   name: "username:package-name",

   // Optional github URL to your source repository.
   git: "https://github.com/something/something.git",
});

/* This defines your actual package */
Package.onUse(function (api) {

   // If no version is specified for an 'api.use' dependency, use the
   // one defined in Meteor 0.9.0.
   api.versionsFrom('0.9.0');

   // Use Underscore package, but only on the server.
   // Version not specified, so it will be as of Meteor 0.9.0.
   api.use('underscore', 'server');

   // Use iron:router package, version 1.0.0 or newer.
   api.use('iron:[email protected]');

   // Give users of this package access to the Templating package.
   api.imply('templating')

   // Export the object 'Email' to packages or apps that use this package.
   api.export('Email', 'server');

   // Specify the source code for the package.
   api.addFiles('email.js', 'server');
});

/* This defines the tests for the package */
Package.onTest(function (api) {

   // Sets up a dependency on this package
   api.use('username:package-name');

   // Allows you to use the 'tinytest' framework
   api.use('[email protected]');

   // Specify the source code for the package tests
   api.addFiles('email_tests.js', 'server');
});

/* This lets you use npm packages in your package*/
Npm.depends({
   simplesmtp: "0.3.10",
   "stream-buffers": "0.2.5"
});

Conforme já discutido no capítulo Cobranças, todos os nossos dados estão disponíveis no lado do cliente. Este é um problema de segurança que pode ser tratado com métodos de publicação e assinatura.

Removendo Autopublish

Neste exemplo, vamos usar PlayersCollectioncoleta com os seguintes dados. Preparamos esta coleção antes para poder nos concentrar no capítulo em si. Se você não tem certeza de como criar coleções MongoDB no aplicativo meteoro, verifique nosso capítulo de coleções .

Para proteger nossos dados, precisamos remover autopublish pacote que estava nos permitindo usar os dados do lado do cliente.

C:\Users\username\Desktop\meteorApp>meteor remove autopublish

Após esta etapa, não seremos capazes de obter os dados do banco de dados do lado do cliente. Só poderemos vê-lo do lado do servidor na janela do prompt de comando. Verifique o seguinte código -

meteorApp.js

var PlayersCollection = new Mongo.Collection('playersCollection');
var myLog = PlayersCollection.find().fetch();
console.log(myLog);

o command prompt janela irá mostrar toda a coleção com quatro objetos, enquanto o developers consoleirá mostrar uma matriz vazia. Agora nosso aplicativo está mais seguro.

Usando Publicar e Assinar

Digamos que queremos permitir que os clientes usem nossos dados. Para isso, precisamos criarMeteor.publish()método no servidor. Este método enviará os dados ao cliente.

Para poder receber e usar esses dados no lado do cliente, vamos criar Meteor.subscribe()método. No final do exemplo, estamos pesquisando o banco de dados. Este código está sendo executado no cliente e no servidor.

var PlayersCollection = new Mongo.Collection('playersCollection');

if(Meteor.isServer) {

   Meteor.publish('allowedData', function() {
      return PlayersCollection.find();
   })
}

if (Meteor.isClient) {
   Meteor.subscribe('allowedData');
};

Meteor.setTimeout(function() {
   var myLog = PlayersCollection.find().fetch();
   console.log(myLog);
}, 1000);

Podemos ver que nossos dados são registrados tanto no developers console e a command prompt janela.

Filtrando Dados do Cliente

Também podemos publicar parte dos dados. Neste exemplo, estamos publicando dados comname = "John".

var PlayersCollection = new Mongo.Collection('playersCollection');

if(Meteor.isServer) {

   Meteor.publish('allowedData', function() {
      return PlayersCollection.find({name: "John"});
   })
}

if (Meteor.isClient) {
   Meteor.subscribe('allowedData');
};

Meteor.setTimeout(function() {
   myLog = PlayersCollection.find().fetch();
   console.log(myLog);
}, 1000);

Depois de executar este código, o command prompt irá registrar todos os dados, enquanto o lado do cliente console irá apenas registrar dois objetos com o nome John.

O Meteor oferece algumas pastas especiais que podem ajudar os desenvolvedores na estruturação de seus aplicativos.

cliente

Se você criar um clientpasta, tudo dentro desta pasta será executado no lado do cliente. Esta é a pasta onde você pode colocar seuHTML, CSSe do lado do cliente JavaScript. Você deve colocarMeteor.subscribe funções, templates, helpers, e eventsdentro desta pasta. Observe, você não precisa executar oMeteor.isClient função nos arquivos que são colocados dentro do client pasta.

servidor

Os arquivos desta pasta só serão executados no server side. Este é o lugar ondemethods, Meteor.Publish()funções e outros dados confidenciais devem ser mantidos. Todos os dados de autenticação devem ser mantidos aqui. Você não precisa usarMeteor.isServer() para os arquivos dentro desta pasta.

público

Este é o local onde você deve colocar suas imagens, favicons e todos os outros dados que são veiculados ao cliente.

privado

Os arquivos desta pasta podem ser acessados ​​apenas do servidor. Eles serão ocultados do cliente. Você pode colocarJSON ou EJSON arquivos que somente o servidor usará dentro desta pasta.

cliente / compatibilidade

Algumas bibliotecas JavaScript exportam variáveis ​​como globais. Use esta pasta para arquivos que precisam ser executados sem serem agrupados em um novo escopo de variável.

O resto

O resto das pastas pode ser estruturado da maneira que você quiser. O código colocado fora das pastas mencionadas acima será executado noclient e a serverlado. Este é um bom lugar onde você pode definir seus modelos.

Ordem de Carregamento

É sempre bom saber a ordem de carregamento dos arquivos. A lista a seguir foi retirada da Documentação Oficial do Meteor.

  • Os arquivos de modelo HTML são sempre carregados antes de todo o resto

  • Arquivos começando com main. são carregados por último

  • Arquivos dentro de qualquer lib/ o diretório é carregado a seguir

  • Arquivos com caminhos mais profundos são carregados em seguida

  • Os arquivos são carregados em ordem alfabética de todo o caminho

Uma das melhores coisas sobre o Meteor é a facilidade de implantação do aplicativo. Depois que seu aplicativo estiver concluído, há uma maneira fácil de compartilhá-lo com o mundo. Tudo que você precisa fazer é executar o código a seguir na janela do prompt de comando.

C:\Users\username\Desktop\meteorApp>meteor deploy my-first-app-ever.meteor.com

Você será solicitado a entrar na conta de desenvolvedores do Meteor username e password.

Agora, você poderá acessar o aplicativo do navegador no link a seguir com o nome do seu aplicativo.

http://my-first-app-ever.meteor.com/

Neste capítulo, aprenderemos como executar o aplicativo em um dispositivo Android. O Meteor adicionou recentemente esta funcionalidade para o sistema operacional Windows, então precisaremos atualizar nosso aplicativo Meteor para a versão 1.3 beta.

Note- No momento em que este tutorial foi escrito, a versão 1.3 do Meteor está em Beta. Atualizaremos isso assim que a versão de produção for lançada.

Como queremos usar a versão mais recente do Meteor, podemos atualizá-la executando o seguinte código na janela do prompt de comando.

C:\Users\username\Desktop\meteorApp>meteor update --release 1.3-beta.11

Etapa 1 - Instale o Android SDK

Use o link na tabela a seguir para instalar o Android SDK.

Sr. Não. Software e descrição
1

Java Development Kit & Android SDK

Você precisará do Android SDK para executar aplicativos Meteor no ambiente móvel. Se você não o instalou, pode verificar nosso tutorial de configuração do ambiente Android .

Etapa 2 - Adicionar uma plataforma Android

Agora, precisamos adicionar uma plataforma Android ao nosso projeto.

C:\Users\username\Desktop\meteorApp>meteor add-platform android

Etapa 3 - Executar o aplicativo em um emulador Android

Para executar o aplicativo em um emulador Android, usaremos o –verbose comando no final da linha para poder identificar os possíveis erros durante o processo de inicialização.

C:\Users\username\Desktop\meteorApp>meteor run android --verbose

Execute o aplicativo em um dispositivo Android

Como os emuladores do Android são lentos, é sempre uma opção melhor executar o aplicativo diretamente no dispositivo. Você pode fazer isso conectando o dispositivo ao computador, habilitando o modo de desenvolvedor e a depuração USB.

Este processo é diferente para dispositivos específicos. Você precisa encontrarBuild Number dentro settings/Aboute toque sete vezes. Você receberá uma notificação de que é o desenvolvedor e oDeveloper Options será desbloqueado.

Pesquise no seu settings novamente e habilite USB debugging.

Você pode executar o aplicativo Meteor em seu dispositivo móvel usando o seguinte comando no prompt de comando.

C:\Users\username\Desktop\meteorApp>meteor run android-device

Neste capítulo, aprenderemos como criar um aplicativo de tarefas simples.

Etapa 1 - Criar um aplicativo

Abra o prompt de comando e execute o seguinte comando -

C:\Users\username\Desktop>meteor create todo-app

Para ver o aplicativo, você precisa executá-lo com o meteor comande e vá para http://localhost:3000

C:\Users\username\Desktop\todo-app>meteor

Etapa 2 - Criar pastas e arquivos

Em vez da estrutura de arquivo padrão, iremos refatorá-la. Vamos criar umclient pasta, onde iremos criar todo-app.html, todo-app.css e todo-app.js.

C:\Users\username\Desktop\todo-app>mkdir client
C:\Users\username\Desktop\todo-app\client>touch todo-app.html
C:\Users\username\Desktop\todo-app\client>touch todo-app.js

Também criaremos um server pasta com server.js dentro.

C:\Users\username\Desktop\todo-app>mkdir server
C:\Users\username\Desktop\todo-app\server>touch server.js

Finalmente, vamos criar collections pasta com task-collection.js arquivo dentro.

C:\Users\username\Desktop\todo-app>mkdir server
C:\Users\username\Desktop\todo-app\collections>touch task-collection.js

Você pode ver a estrutura do aplicativo na imagem a seguir -

Etapa 3 - client / todo-app.html

Nossa primeira etapa de desenvolvimento é criar HTML para o aplicativo. Precisamos de um campo de entrada onde podemos adicionar novas tarefas. As tarefas serão na forma de uma lista comdelete e checkfuncionalidade. Teremos também funcionalidades para mostrar ou ocultar tarefas concluídas.

<head>
   <title>Todo App</title>
</head>

<body>
   <h1>Todo List ({{incompleteCount}})</h1>

   <label class = "hide-completed">
      <input type = "checkbox" checked = "{{hideCompleted}}" />
      Hide Completed Tasks
   </label>

   <form class = "new-task">
      <input type = "text" name = "text" placeholder = "Add new tasks" />
   </form>

   <ul>
      {{#each tasks}}
         {{> task}}
      {{/each}}
   </ul>
</body>

<template name = "task">
   <li class = "{{#if checked}}checked{{/if}}">
      <button class = "delete">x</button>
      <input type = "checkbox" checked = "{{checked}}" class = "toggle-checked" />
      <span>{{username}} - {{text}}</span>
   </li>
</template>

Etapa 4 - coleções / tarefa-coleção.js

Este é o lugar onde criaremos apenas uma nova coleção do MongoDB, para que possamos usá-la tanto no servidor quanto no cliente.

Tasks = new Mongo.Collection("tasks");

Etapa 5 - server / server.js

Vamos definir métodos para nosso aplicativo no lado do servidor. Esses métodos serão chamados do cliente. Neste arquivo, também publicaremos a consulta ao banco de dados.

// Publishing tasks from the server...

Meteor.publish("tasks", function () {
   return Tasks.find({});
});

// Methods for handling MongoDb Tasks collection data...

Meteor.methods({

   addTask: function (text) {

      Tasks.insert({
         text: text,
         createdAt: new Date(),
      });
   },

   deleteTask: function (taskId) {
      var task = Tasks.findOne(taskId);
      Tasks.remove(taskId);
   },

   setChecked: function (taskId, setChecked) {
      var task = Tasks.findOne(taskId);
      Tasks.update(taskId, { $set: { checked: setChecked} });
   }
});

Etapa 6 - client / todo-app.js

Este é o arquivo JavaScript principal do cliente. Este arquivo também pode ser refatorado, mas escreveremos todo o código do lado do cliente aqui. Primeiro, nós assinamos otaskcoleção publicada no servidor. Então, nós criamoshelpers para ser capaz de lidar com a lógica do aplicativo e, finalmente, definimos o events que chamará os métodos do servidor.

// Subscribing to the published tasks
Meteor.subscribe("tasks");

// Show/Hide functionality
Template.body.helpers({

   tasks: function () {

      if (Session.get("hideCompleted")) {

         // If hide completed is checked, filter tasks
         return Tasks.find({checked: {$ne: true}}, {sort: {createdAt: -1}}); } else { // Otherwise, return all of the tasks return Tasks.find({}, {sort: {createdAt: -1}}); } }, hideCompleted: function () { return Session.get("hideCompleted"); }, incompleteCount: function () { return Tasks.find({checked: {$ne: true}}).count();
   }
});

// Events for creating new tasks and Show/Hide functionality.
// Calling methods from the server

Template.body.events({

   "submit .new-task": function (event) {
      event.preventDefault();
      var text = event.target.text.value;

      Meteor.call("addTask", text);
      event.target.text.value = "";
   },

   "change .hide-completed input": function (event) {
      Session.set("hideCompleted", event.target.checked);
   }
});

// Events for Deleting and Check/Uncheck functionality
Template.task.events({
   
   "click .toggle-checked": function () {

      // Set the checked property to the opposite of its current value
      Meteor.call("setChecked", this._id, ! this.checked);
   },

   "click .delete": function () {
      Meteor.call("deleteTask", this._id);
   }
});

Etapa 7 - Implantar

Depois que terminarmos o desenvolvimento, podemos implantar o aplicativo a partir da janela do prompt de comando. O nome de implantação do nosso aplicativo serámy-first-todo-app.

C:\Users\username\Desktop\todo-app>meteor deploy my-first-todo-app

Podemos abrir o http://my-first-todo-app.meteor.com/ para começar a usar nosso aplicativo.

Já cobrimos algumas das melhores práticas de desenvolvimento do Meteor nos capítulos anteriores. A seguir estão algumas das melhores práticas a serem mantidas em mente ao usar o Meteor.

Estrutura de Diretório

Não existem regras estritas sobre a estrutura de diretório em aplicativos Meteor. Para obter mais informações sobre as diretrizes, consulte o capítulo Meteor - Estrutura .

Métodos de Uso

Você deve sempre usar Meteor - Métodos ao trabalhar com dados sensíveis em vez de chamarinsert, update, e remove diretamente do cliente.

Gestão de dados

Proteja seus dados usando os métodos Publicar e Assinar . Se você deseja que seus dados estejam disponíveis para todos os clientes, você pode usarnullcomo o nome da publicação. A publicação de pequenos blocos de dados também melhora o desempenho do aplicativo.

Validar Dados

Você deve validar todos os dados que serão armazenados na coleção. Uma das melhores opções é o pacote collection2 . Este pacote torna fácil definir a validação do lado do servidor e do cliente.

Minimize Sessão

o session variáveis ​​são variáveis ​​globais e usar globais vai contra as melhores práticas de JavaScript.

Roteador

Existem duas opções mais populares para o roteamento do Meteor. Para aplicativos menores, existe o Iron Router . Ele é executado novamente automaticamente quando os dados são alterados. Para aplicativos maiores, existe o Flow Router . Este roteador dá a você mais liberdade para otimizar a re-renderização dos modelos ao custo de um pouco mais de código clichê.

Pacotes

Sempre verifique se o pacote é atualizado regularmente antes de optar por usá-lo dentro do seu aplicativo.