Maison > interface Web > js tutoriel > le corps du texte

Exemple d'utilisation de Meteor et Node.js pour écrire un chat en temps réel application_node.js

WBOY
Libérer: 2016-05-16 15:53:23
original
1233 Les gens l'ont consulté

Le framework que je vois souvent par rapport à Derby.js est Meteor.js Semblable à Derby, il peut également mettre à jour les vues en temps réel sous plusieurs clients, bien que la méthode ci-dessus puisse être un peu différente. de Derby. Derby peut facilement utiliser une variété de bases de données, tandis que Meteor n'est proche que de MongoDB. En fait, l'API pour accéder à la base de données via le client tel que Mongoose est la même que celle que vous utilisez sur le. serveur. C’est très proche de ce à quoi je m’attendais.

Bien que Meteor soit désormais un framework présentant quelques lacunes et controverses, Meteor semble être un choix très intéressant pour créer des applications avec des exigences en temps réel. Personnellement, j'aime toujours Derby. La forme de programmation basée sur les rappels traditionnels est plus attrayante. moi, mais dans Derby Derrière sa puissance, il manque une documentation robuste et une grande communauté de développeurs, ce qui est sans aucun doute un coup dur. Peut-être que cela changera avec le temps, mais ce sera toujours beaucoup plus lent que Meteor, car ce dernier a récemment reçu 11 millions de dollars. en financement. Ce financement financier garantit l'existence et le soutien continu de Meteor. Pour les développeurs qui ont besoin d'un cadre financièrement et développementalement stable, ce financement ne fera que rendre Meteor encore meilleur. sur la façon de créer une nouvelle application Meteor, réaliste mais simple. Essentiellement, il s'agit d'une application basée sur le screencast Vimeo de Tom Guide du débutant. La plus grande différence par rapport au screencast Vimeo de Tom est la façon dont les événements sont gérés au lieu du copier-coller. code d'un exemple Meteor, je vais vous expliquer étape par étape ma propre façon de soumettre un message à l'aide de la touche Entrée.

.

Créer une application Météore

Un gros avantage que Derby et Meteor ont en commun réside dans leurs outils de ligne de commande respectifs. Contrairement à Derby qui utilise l'outil npm intégré de Node, Meteor utilise le sien.

Dans le terminal (Mac OS X et Linux), exécutez la commande suivante (Veuillez vous assurer d'avoir installé Node avant de faire cela)

$curl https://install.meteor.com | /bin/sh

Copier après la connexion

Metror le fera tout seul et installera les outils de ligne de commande.

Pour créer un nouveau projet, accédez d'abord à votre répertoire de travail et exécutez le code ci-dessous. Cela créera un répertoire contenant Meteor et un programme modèle de base.

$meteor create chat

Copier après la connexion

Maintenant, vous pouvez accéder à ce répertoire et exécuter le code ci-dessous pour le faire fonctionner

$cdchat$meteor
Running on: http://localhost:3000/

Copier après la connexion

Pour voir cette application la plus basique, il vous suffit d'ouvrir http://localhost:3000/

dans n'importe quel navigateur moderne

Tant que vous le souhaitez, vous pouvez utiliser la commande meteor déployer intégrée de Meteor pour déployer votre application sur le propre serveur de Meteor

$meteor deploy my-app-name.meteor.com

Copier après la connexion

Tant que vous mettez à jour et enregistrez votre code, tous les navigateurs connectés mettront à jour leurs pages en temps réel.

Développement d'applications de chat

Dans le dossier généré par la commande Meteor Create, vous pouvez voir différents fichiers. Si vous savez comment afficher les fichiers cachés, vous pouvez également voir le dossier .meteor. Ce dossier contient Meteor lui-même, ainsi que les fichiers de données MongoDB.

Dans le dossier racine de votre application, vous devriez pouvoir voir ces trois fichiers : chat.html, chat.css et chat.js. Ces trois fichiers sont tous accompagnés de leurs propres descriptions. Le fichier HTML contient le modèle et l'apparence de l'application, qui sont définis par chat.css. Les fichiers Javascript contiennent des scripts à exécuter côté client et côté serveur. Il est important de ne rien mettre dans ce fichier de script, comme des paramètres de configuration et des mots de passe, car tout le monde peut les voir en examinant le code de votre application.

Ouvrez le fichier chat.js avec votre logiciel d'édition de texte préféré. Personnellement, j'aime utiliser Sublime Text2 car cet outil est simple et comporte plusieurs invites d'état de la souris.

Vous pouvez voir le code suivant dans le fichier chat.js :

if (Meteor.is_client) { Template.hello.greeting = function () { return "Welcome to chat."; }; Template.hello.events = { 'click input' : function () { // template data, if any, is available in 'this' if (typeof console !== 'undefined') console.log("You pressed the button"); } }; } if (Meteor.is_server) { Meteor.startup(function () { // code to run on server at startup }); }
Copier après la connexion

Dans Meteor.js, faites attention aux deux parties Meteor.is_client et Meteor.is_server dans le paragraphe if. Le code de ces blocs sera exécuté séparément Lorsque la machine exécutant ce code est le client, seul le code du bloc clint sera exécuté. Il en va de même pour le serveur. Cela illustre les capacités de partage de code de Meteor dans des applications pratiques.

Supprimez tout le code des sections Meteor.is_client et Meteor.is_server dans le if, en ne laissant qu'une seule section :

if (Meteor.is_client) { }
Copier après la connexion

Notez qu'après avoir enregistré le fichier de script, votre navigateur s'actualisera immédiatement pour charger ce nouveau code.

Créer une vue

Avant de commencer officiellement à travailler sur ce fichier de script, nous devons créer une nouvelle vue pour afficher les enregistrements de discussion. Ouvrez chat.html dans l'éditeur et supprimez le code dans la balise body. Incluez la balise de modèle nommée hello Only Leave. la partie suivante

<head>
 <title>chat</title>
</head>

<body>

</body>

Copier après la connexion

Puis ajoutez la phrase suivante dans la balise body

{{> entryfield}}

Copier après la connexion

Meteor使用的模板系统与Mustache很相似.大括号{% raw %}{{}}{% endraw %}表示要呈现的内容. 通过简单地在两对大括号里添加内容如{% raw %}{{hello}}{% endraw %}, 模板系统会用hello这个变量的值来替换它. 后面会更详细的介绍.

注意到了在entryfield这个词前面有个大于号>了吗? 使用该符号来指定渲染哪一个模板.

<template name="entryfield">
  <input type="text" id="name" placeholder="Name" /> <input type="text" id="message" placeholder="Your Message" />
</template>

Copier après la connexion

在这个例子中,template标签有单个属性, 即模板的名字, 这就是我们要渲染的模板, 注意, 模板的名字要和body里的代码指定的模板名字一样 ({{> entryfield}})


查看浏览器, 你会发现页面已经刷新了, 输入框已经呈现出来了.

接下来, 在body里边添加另外的一个mutache标签用以渲染讯息列表

{{> messages}}

Copier après la connexion

最后, 我们还需要新建一个名叫messages的模板. 在entryfield模板下面添加下面这段代码

<template name="messages">
  <p>
    {{#each messages}}
      <strong>{{name}}</strong>- {{message}}
    {{/each}}
  </p>
</template>

Copier après la connexion

注意到each子句. 在Meteor中你可以使用如下的语法来遍历一个数组模板

{{#each [name of array]}}
{{/each}}

Copier après la connexion

使用each循环时,上下文会有所改变. 当引用变量的时候, 实际上你引用的是每一个数组元素的值.

例如,在我们的chat应用中, 我们遍历了数组模板"messages"里边的每个元素, 该数组可以像下面这样,

[
  {
    "name": "Andrew",
    "message": "Hello world!"
  },
  {
    "name": "Bob",
    "message": "Hey, Andrew!""
  }
]

Copier après la connexion

然后, 在each循环中, 你可以看到{% raw %}{{message}}{% endraw %}{% raw %}{{name}}{% endraw %}, 这会引用 每一个数组元素的值来替代(Andrew 和 Bob 替换 name, 以及各自的问候信息.)

当返回到你的浏览器, 你还看不到任何的改变. 因为讯息数组还没被传送到模板, 所以Meteor遍历不到任何东西来呈现.

你的chat.html最后应该是这样的


 chat



 {{> entryfield}}

 {{> messages}}


<template name="entryfield">
  <input type="text" id="name" placeholder="Name" /> <input type="text" id="message" placeholder="Your Message" />
</template>



Copier après la connexion


Javascript

从现在开始, 我们处理的大部分代码都是客户端代码, 所以, 除非特别说明, 以下的代码都是在if (Meteor.is_client)代码块中.

在我们编写展示讯息的代码之前,让我们先新建一个Collection. 从本质上讲, 这是一组Models. 换句话说, 在这个chat应用的环境下, Messages collection保存着整个聊天记录, 而每条讯息记录是一个Model.

在if语句前, 添加如下代码来初始化Collection:

Messages = new Meteor.Collection('messages');

Copier après la connexion

因为我们希望这个Collection可以在客户端和服务端被创建, 所以我们把它写在了客户端代码块之外.

由于Meteor为我们做了大部分的工作, 要展示聊天记录是非常容易的. 只需要把下面的代码添加进if语句里边.

Template.messages.messages = function(){
  return Messages.find({}, { sort: { time: -1 }});
}

Copier après la connexion

让我们拆开来分析这段代码:

Template.messages.messages = function(){ … }
Copier après la connexion
Copier après la connexion
Copier après la connexion

第一部分Template表示我们正在修改一个模板的行为.

Template.messages.messages = function(){ … }
Copier après la connexion
Copier après la connexion
Copier après la connexion

第二部分messages是模板的名字, 表示是在修改哪一个模板. 例如,如果我们想要对"entryfield"模板做些什么, 只需把代码改成

Template.entryfields.variable = function(){ … } 
Copier après la connexion

(在这里, 请别这么做)

Template.messages.messages = function(){ … }
Copier après la connexion
Copier après la connexion
Copier après la connexion

第三部分的这个messages代表的是一个这个模板里的一个变量. 还记得我们的each循环遍历messages吗? 这就是那个mesaages.

当你打开浏览器时, 页面还是没有什么改变. 这是意料之中的事, 因为我们只抓取的讯息, 而没有展示出来.

此时,你的chat.js应该是这样的. 是否很惊讶就只需在服务器写这么些代码我们就能展示一个实时的聊天记录应用.

Messages = new Meteor.Collection('messages');

if (Meteor.is_client) {
 Template.messages.messages = function(){
  return Messages.find({}, { sort: { time: -1 }});
 }
}

Copier après la connexion


在console里添加Message


这部分的内容是可选的, 当然它有助于你调试程序. 你可以直接跳过往下学习建立form来响应键盘事件(key press).

如果你想要测试你的讯息显示代码, 你可以手动插入一条记录到数据库. 打开你的浏览器控制台, 并输入如下:

Messages.insert({ name: 'Andrew', message: 'Hello world!', time: 0 })

Copier après la connexion

这将会在数据库中新建一条记录, 如果正确的操作了的话,那浏览器就会即刻更新这条讯息在页面上.

消息表单

回到chat.js文件当中,我们会将供输入的form和数据库链接起来以接收用户聊天数据的提交。在底部添加下面的代码,不过注意要在if语句块中。


Template.entryfield.events = {
 "keydown #message": function(event){
  if(event.which == 13){
   // Submit the form
   var name = document.getElementById('name');
   var message = document.getElementById('message');
 
   if(name.value != '' && message.value != ''){
    Messages.insert({
     name: name.value,
     message: message.value,
     time: Date.now()
    });
 
    name.value = '';
    message.value = '';
   }
  }
 }
}
Copier après la connexion

代码有点多,让我们再回顾一遍。你也许还记得,在Template后面的第二个单词决定了我们正在修改的是哪个模板。不过跟之前不同的是,我们写的代码是用来绑定数据库和messages模板的,我们正在修改的模板是entryfield。

这个模板中events的属性包含了一个object,events的属性按照下面的格式呈现:


"[eventname] [selector]"
例如,如果我们想为一个ID为hello的button绑定一个点击事件的话,我们会把下面的代码加入到events的个结构体当中。

"click #hello": function(event){ … }
在我们的例子当中,我们是将一个函数绑定到了ID为“message”的一个keydown事件当中。如果你还记得,这段代码早在我们在chat.html文件中建立模板的时候就已经设定好了。


在事件对象中,每个key都有一个函数作为它的值。这个函数在事件被调用时执行,其中事件对象作为第一个参数传递给该函数。在我们的app里,每当ID带有“message”的输入栏中有任意键被按下(keydown)时,该函数就被调用了。

函数内的代码相当简单。首先,我们检查回车键是否被按下(输入中有13的关键代码)。第二,我们通过ID取得两个输入栏的DOM元素。第三,我们检查并确保输入值不为空,以防止用户提交一个空的名字或信息(name or message)。

注意下面的代码很重要。这段代码是将message插入数据库。

Messages.insert({
 name: name.value,
 message: message.value,
 time: Date.now()
});

Copier après la connexion

正如你看到的,这和我们插入到控制台的代码类似,但不是硬编码的数值,我们用的是DOM元素的值。此外,我们加入了当前时间,以保证聊天日志被正确的按时间排序。


最后,我们将两个输入的值简单的设为''以清空输入栏。

现在,如果你进入浏览器,你可以试着输入一个名字与信息到两个输入栏。按下回车以后,输入栏将被清除,一个新的消息会出现在你的输入字段的正下方。打开另一个浏览器窗口,导航到同一个URL(http://localhost:3000/)。试着键入另一个信息,而

正如你看到的,Meteor非常强大。不需要写一行明确更新消息日志的代码,新的信息显示出来并同步到多个浏览器和客户端。

总结

虽然Meteor工作起来非常酷,而且也有一些非常有用的应用支持它,比如Derby.js,但它是不成熟的。一个说明这一点例子就是,浏览文档并找找红色的引文。例如,关于MongoDB集合该文档做了如下陈述:

    目前客户端被给予集合的完全写访问权限。它们可以执行任意的更新命令。一旦我们建立鉴权认证,你将能够限制客户端的直接插入,更新和删除。我们也在考虑校验器或者其他类似ORM的功能。

任何用户拥有完全的写访问权限是一个非常大的问题,因为对任何一个app产品——如果一个用户对你的整个数据库有写访问权限,这是一个相当大的安全问题。

看到Meteor(和Derby.js!)在像哪个方向前进是令人激动的,但是除非它成熟一点,它可能不是一个产品级应用的最好选择。期待那1100万美元资金能很好的利用起来。

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal