Questo è il 2013. Se stai per costruire una webapp, devi aggiungere funzionalità in tempo reale all'app. È lo standard. Meteor fa un buon lavoro aiutandoti a creare rapidamente e realizzare app in tempo reale. Ma la meteora è strettamente accoppiata con MongoDB ed è l'unico modo per aggiungere funzionalità in tempo reale. A volte, questo è eccessivo.
MongoDB è una partita perfetta per Meteor. Ma non abbiamo bisogno di usare MongoDB per tutte le nostre attività in tempo reale. Per alcuni problemi, le soluzioni basate su messaggi funzionano molto bene. È lo stesso problema che stanno affrontando anche pubnub e realtime.co..
Sarebbe bello se potessimo avere un approccio ibrido in tempo reale, in Meteor, combinando l'approccio basato su Raccolta MongoDB e un approccio basato su Messaging. Così Meteor Streams è nato per aggiungere questa comunicazione basata su messaggi in tempo reale a Meteor.
Un flusso è il componente base di Meteor Streams. È un EventEmitter in tempo reale. Con un flusso, è possibile passare i messaggi avanti e indietro tra i client connessi. È altamente gestibile e ha un ottimo modello di sicurezza.
Creiamo una semplice applicazione di chat basata su console browser con Meteor Streams. Per prima cosa creeremo una nuova applicazione Meteor:
meteora crea ciao-stream
Successivamente installiamo i flussi di Meteor dall'atmosfera:
aggiungere i flussi
Quindi dobbiamo creare un file chiamato Chat.js
e inserire il seguente codice:
chatStream = new Meteor.Stream ('chat'); if (Meteor.isClient) sendChat = function (message) chatStream.emit ('message', message); console.log ('me:' + messaggio); ; chatStream.on ('message', function (message) console.log ('user:' + message););
Inizia la tua app con:
meteora
La tua app sarà ora in esecuzione - http: // localhost: 3000
.
Ora hai un'app di chat completamente funzionante. Per iniziare a chattare, apri la console del browser e usa il sendChat
metodo come mostrato di seguito.
È piuttosto difficile capire i flussi di Meteor con un semplice esempio basato su console, come quello appena creato. Quindi, costruiamo un'applicazione di chat completa per familiarizzare con Meteor Streams.
L'app che stiamo creando è un'applicazione di chat basata sul Web. Chiunque può chattare in modo anonimo. Inoltre, gli utenti possono registrarsi e chattare con la loro identità (username). Ha anche un sistema di filtraggio, che filtra le parolacce (parolacce).
Alla fine, assomiglierà a qualcosa del genere. Puoi prendere il codice sorgente da github per vedere il risultato finale.
Creiamo un'app Meteor standard e installiamo i flussi di Meteor dall'atmosfera. Aggiungeremo anche il supporto per Bootstrap e Meteor Accounts.
meteor creare awesome-chat-app cd awesome-chat-app meteor rimuovi insecure autopublish meteor aggiungi account bootstrap-account password-ui mrt aggiungi stream rm awesome-chat-app. * // rimuovi i file aggiunti automaticamente
L'interfaccia utente per la nostra app sarà piuttosto semplice. Noi abbiamo un div
mostrando i messaggi di chat e un ingresso
casella per inserire nuovi messaggi di chat. Vedi sotto per l'HTML completo della nostra interfaccia utente. Controlla i commenti in linea se hai bisogno di aiuto per capire il codice.
Aggiungi il seguente contenuto in client / home.html
:
Impressionante app di chat > mainBoxImpressionante app di chat
loginButtons > chatBox#each messages > chatMessage / each
utente: Messaggio
La reattività di Meteor è un concetto fantastico e molto utile. Ora, Meteor Streams non è una fonte di dati reattiva. Ma può funzionare bene con le sole raccolte locali per fornire reattività.
Come suggerisce il nome, le raccolte solo locali non sincronizzano i propri dati con il server. I suoi dati sono disponibili solo all'interno del client (scheda del browser).
Aggiungi il seguente contenuto in lib / namespace.js
per creare la nostra unica raccolta locale:
if (Meteor.isClient) chatCollection = new Meteor.Collection (null);
Ora è il momento di cablare i nostri modelli con la collezione. Facciamo quanto segue:
messaggi
aiuto in Chatbox
modello.utente
aiuto in chatMessage
modello.Invia chat
viene cliccato il pulsante, aggiungi il messaggio di chat digitato nella raccolta.Aggiungi il seguente contenuto a client / ui.js
:
// assegna la raccolta al helper 'messages' nel template 'chatBox' Template.chatBox.helpers ("messages": function () return chatCollection.find ();); // genera un valore per l'helper 'utente' nel modello 'chatMessage' Template.chatMessage.helpers ("utente": function () return this.userId;); // quando si fa clic su "Invia chat", aggiungi il messaggio di chat digitato nella raccolta Template.chatBox.events ("fai clic su #send": function () var message = $ ('# chat-message'). val () ; chatCollection.insert (userId: 'me', message: message); $ ('# chat-message'). val ("););
Con le suddette modifiche sarete in grado di chattare, ma i messaggi vengono visualizzati solo sul client. Quindi passiamo il resto del lavoro a Meteor Streams.
Creeremo lo stream sia sul client che sul server (con lo stesso nome) e aggiungendo le autorizzazioni necessarie.
Aggiungere il seguente codice in lib / namespace.js
per creare lo stream:
chatStream = new Meteor.Stream ('chat-stream');
Basta creare il flusso da solo non è abbastanza; dobbiamo dare le autorizzazioni necessarie, che consentono ai clienti di comunicare attraverso di essa. Esistono due tipi di permessi (lettura e scrittura). Dobbiamo prendere in considerazione l'evento, l'ID utente e l'abbonamentoId quando stiamo creando l'autorizzazione.
ID utente
è l'ID utente del client connesso allo stream.subscriptionId
è l'identificativo univoco creato per ogni client connesso allo stream.Per la nostra app di chat, dobbiamo dare a chiunque usi l'app l'accesso completo in lettura e scrittura al Chiacchierare
evento. In questo modo, i client possono usarlo per inviare e ricevere messaggi di chat.
Aggiungere il seguente codice a server / permissions.js
:
chatStream.permissions.read (function (eventName) return eventName == 'chat';); chatStream.permissions.write (function (eventName) return eventName == 'chat';);
Ora che abbiamo uno stream completamente funzionante, collegalo all'interfaccia utente in modo che altri possano vedere i messaggi che stai inviando.
La prima cosa che dobbiamo fare è aggiungere i nostri messaggi di chat allo stream, quando clicchiamo su Invia chat
pulsante. Per questo, abbiamo bisogno di modificare il codice relativo al Invia chat evento clic del pulsante (fai clic su #send), come segue (in client / ui.js
):
Template.chatBox.events ("click #send": function () var message = $ ('# chat-message'). Val (); chatCollection.insert (userId: 'me', messaggio: messaggio) ; $ ('# chat-message'). val ("); // == ECCO IL CAMBIAMENTO == // aggiungi il messaggio allo stream chatStream.emit ('chat', messaggio););
Quindi abbiamo bisogno di ascoltare il flusso per il Chiacchierare
evento e aggiungere il messaggio al chatCollection
che viene reso nell'interfaccia utente, in modo reattivo. Aggiungere il seguente codice al client / ui.js
file:
chatStream.on ('chat', funzione (messaggio) chatCollection.insert (userId: this.userId, // questo è il userId del mittente subscriptionId: this.subscriptionId, // this is the subscriptionId del messaggio mittente: Messaggio ); );
Ora abbiamo bisogno di modificare la logica che genera il valore per il utente
aiuto in chatMessage
modello come segue:
utente-
anonimo-
Modifica il codice per utente
aiuto in chatMessage
modello per riflettere i cambiamenti di cui sopra (in client / ui.js
):
Template.chatMessage.helpers ("utente": function () var nickname = (this.userId)? 'User-' + this.userId: 'anonymous-' + this.subscriptionId; return nickname;);
ID utente
Mostrando solo il ID utente
non è molto utile Quindi cambiamo per visualizzare il nome utente effettivo. Qui, utilizzeremo Meteor Pub / Sub per ottenere il nome utente per un dato ID utente.
Prima di tutto, consente di configurare Meteor Accounts per accettare il nome utente durante la creazione dell'utente. Aggiungere il seguente codice a client / users.js
:
Accounts.ui.config (passwordSignupFields: "USERNAME_ONLY");
Quindi creiamo la pubblicazione per ottenere l'utente. Aggiungere il seguente codice a server / users.js
. Restituisce semplicemente il nome utente per un dato ID utente.
Meteor.publish ("user-info", function (id) return Meteor.users.find (_ id: id, fields: username: 1););
Ora dobbiamo creare un abbonamento sul client per ogni utente a cui siamo interessati. Lo faremo all'interno di un metodo. Inoltre, dopo aver ottenuto il nome utente, deve essere assegnato a una variabile di sessione. Quindi possiamo usare la variabile di sessione all'interno di utente
aiuto per ottenere il nome utente in modo reattivo.
Aggiungere il seguente codice in client / users.js
:
getUsername = function (id) Meteor.subscribe ('user-info', id); Deps.autorun (function () var user = Meteor.users.findOne (id); if (utente) Session.set ('user-' + id, user.username););
Infine, modifichiamo il utente
aiuto in chatMessage
modello per ottenere il nome utente dalla sessione (in client / ui.js
):
Template.chatMessage.helpers ("utente": function () if (this.userId == 'me') return this.userId; else if (this.userId) getUsername (this.userId); sessione di ritorno .get ('user-' + this.userId); else return 'anonymous-' + this.subscriptionId;);
La nostra app di chat farà in modo di nascondere qualsiasi volgarità. Se qualcuno tenta di inviare un messaggio con alcune parolacce, dobbiamo filtrarle. Meteor Stream ha una funzione chiamata filtri, progettata per questo. Vediamo come possiamo filtrare la parola scemo
da qualsiasi messaggio di chat.
Aggiungi il seguente codice in server / filters.js
:
chatStream.addFilter (function (eventName, args) if (eventName == 'chat') var message = args [0]; if (message) message = message.replace (/ fool / ig, '**** '); return [messaggio]; else return args;);
Sentiti libero di aggiungere i tuoi filtri.
La nostra app di chat è ora completa. Puoi vedere una versione live dell'app all'indirizzo http://streams-chat.meteor.com. Inoltre, il codice sorgente per l'app è disponibile su Github.
In questo tutorial abbiamo creato un'applicazione di chat usando raccolte solo locali
per aggiungere reattività e usare Meteor Pub / Sub
per ottenere il nome utente di un utente. Speriamo che possiate vedere quanto bene i flussi di Meteor possono funzionare con le funzionalità Meteor esistenti. Tuttavia, questa è solo un'introduzione a Meteor Streams, per risorse aggiuntive, controlla i seguenti link: