位置: 编程技术 - 正文

使用Meteor配合Node.js编写实时聊天应用的范例

编辑:rootadmin

推荐整理分享使用Meteor配合Node.js编写实时聊天应用的范例,希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!

我经常见到被拿来与Derby.js做比较的框架是Meteor.js. 与Derby相似的是,它也能在多个客户端下实时更新views, 尽管做法上可能跟Derby有点不同. Derby可以较容易的使用多种数据库, 而Meteor则只亲近于MongoDB. 事实上, 通过如Mongoose客户端接入数据库的API与你在服务端所期望的已经非常接近了.

虽然现在meteor是个有一些缺点和争议的框架, 但Meteor看起来是非常有趣的选择用来建立有实时需求的应用. 个人还是喜欢Derby基于传统回调的编程形式更吸引我, 但在Derby的强大背后,却缺乏健壮的文档和一个大的开发者社区, 这无疑是个很大的打击. 或许这会随着时间推移而有所改变吧, 但比起Meteor来说还是会慢很多, 因为后者最近获得了万美元的资金. 这笔财政资金确保了Meteor的存在以及得到持续的支持. 对于那些需要财政与发展稳定的框架的开发者而言, 这笔资金只会让Meteor更加优胜. <!-- more --> 今天,让我们一起来看看如何新建一个真实的但又简单的Meteor应用. 本质上说, 这是基于Tom的 Vimeo screencast的一个新手指引. 与Tom的 Vimeo screencast最大的不同是处理事件的方式. 比起复制粘贴一个Meteor示例的代码, 我会一步一步的通过自己的方式来处理使用Enter键来提交一则讯息. 让我们开始吧.

创建一个 Meteor应用

Derby和Meteor 他们共有的一个大加分是他们各自的命令行工具. 与Derby使用Node的内置的 npm 工具所不同的是, Meteor使用的是它自己的.

在终端(Mac OS X 和 Linux),执行如下的命令. (在这之前请确保你已经安装了Node)

Metror会自己搞定,并安装命令行工具.

要新建一个项目, 先转到你的工作目录然后运行下边的代码. 这会创建一个目录, 里边包括有Meteor和一个最基本模板程序.

现在, 你可以转到该目录并运行下面的代码让它跑起来

想要看到这个最基础的应用程序, 你只需要在任意一款不过时的浏览器下打开 你就可以使用Meteor内置的meteor deploy命令来部署你的应用到Meteor自己的服务器上

只要你更新保存了你的代码, 所有连接上的浏览器都会实时更新其页面.

开发聊天应用

在Meteor Create指令产生的文件夹中,你可以看见不同的文件。如果你知道怎么查看隐藏文件的话,你还可以看见个.meteor这个文件夹。这个文件夹包含了Meteor它本身,以及MongoDB的数据文件。

在你App的根目录文件夹下,你应该可以看到这三个文件:chat.html, chat.css和chat.js。这三个文件都是自带说明部分的。HTML文件包含了App的模型以及外观,他们都是被chat.css定义的。Javascript文件包含了在client和server端要执行的脚本。有一点很重要,不要把任何东西放进这个脚本文件,比如说配置参数和密码,因为任何人都可以通过查看你应用程序的代码看到这些。

用你喜欢的文本编辑软件打开chat.js这个文件。就个人而言,我喜欢用Sublime Text2,因为这个工具简洁还有多种鼠标状态提示。

你可以在chat.js文件中查看到下面这样一段代码:

在Meteor.js中注意if段落中Meteor.is_client和Meteor.is_server的两个部分。在这些区块中的代码会分开执行,当运行这段代码的机器是client端则只运行clint块中的代码,server同理。这就说明了Meteor在实际运用中的代码共享能力。

删除掉if中所有Meteor.is_client和Meteor.is_server段的代码,最后只剩下一段:

注意,当你保存了 脚本文件之后,你的浏览器会立刻刷新加载这段新的代码。

创建视图(View)

在我们正式对这个脚本文件动工之前, 我们需要先新建一个视图用来展示聊天记录. 在编辑器里打开chat.html并删除body标签里边的代码. 包括名为hello的template标签.只留如下部分

接着在body标签里添加下面这句

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

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

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

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

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

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

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

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

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

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

使用Meteor配合Node.js编写实时聊天应用的范例

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

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

Javascript

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

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

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

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

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

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

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

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

(在这里, 请别这么做)

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

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

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

在console里添加Message

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

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

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

消息表单

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

代码有点多,让我们再回顾一遍。你也许还记得,在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)时,该函数就被调用了。

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

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

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

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

现在,如果你进入浏览器,你可以试着输入一个名字与信息到两个输入栏。按下回车以后,输入栏将被清除,一个新的消息会出现在你的输入字段的正下方。打开另一个浏览器窗口,导航到同一个URL( 目前客户端被给予集合的完全写访问权限。它们可以执行任意的更新命令。一旦我们建立鉴权认证,你将能够限制客户端的直接插入,更新和删除。我们也在考虑校验器或者其他类似ORM的功能。

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

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

Node.js编程中客户端Session的使用详解 静态网站很容易扩展。你只需要全部缓存,不需要考虑从不同服务器组合有状态的内容给用户。可惜,大多数Web应用使用有状态的内容提供个性化体验

浅析Node.js中的内存泄漏问题 这篇文章是由Mozilla的Identity团队带来的ANode.JSHolidaySeason系列文章的首篇,该团队上个月发布了Persona的第一个测试版本。在开发Persona时我们构建了一系列

浅析Node.js中使用依赖注入的相关问题及解决方法 最近,我转向使用依赖注入来帮助理解分离代码的简单途径,并有助测试。然而,Node.js中的模块依赖Node提供的系统API,这很难判断私有依赖被恰当的使

标签: 使用Meteor配合Node.js编写实时聊天应用的范例

本文链接地址:https://www.jiuchutong.com/biancheng/377986.html 转载请保留说明!

上一篇:充分发挥Node.js程序性能的一些方法介绍(充分发挥党员的先锋模范作用,积极)

下一篇:Node.js编程中客户端Session的使用详解(node.js详解)

  • 个税手续费返还会计分录
  • 工会开户所需资料怎么写
  • 民办非营利组织幼儿园清算时固定资产如何处理
  • 老板投资的钱怎么入账
  • 契税法律依据
  • 销售种子的税种有哪些税率为多少?
  • 福利费开专票怎么处理
  • 工会有纳税号吗
  • 企业没交社保年限怎么算
  • 对外捐赠视同销售分录
  • 老板在外地怎么辞职
  • 收到红字发票后怎么做账
  • 银行承兑汇票怎么取钱
  • 税务变更后之前的进项
  • 其他收益是一级科目还是二级科目
  • 企业增加的留存收益计入
  • 高新技术企业资格复核
  • 计提本月城市维护建设税,教育费附加500元
  • 产品的销售收入减去全部生产成本叫
  • 跨年的所得税怎么冲
  • 台式电脑机箱怎么选
  • ffmpeg安装教程linux
  • 无偿受赠房产出售税费
  • 工程改造怎么做账
  • 整理php防注入和注入
  • 场外期权会计核算
  • vue项目中技巧知识点
  • 日本东京秋叶原攻略
  • 雷尼尔山位于美国西北部
  • 过拟合能不能从根本上解决
  • vue鼠标点击事件点击改变效果,再次点击恢复效果
  • 营业额500万算什么企业
  • vue引入文件路径@的意思
  • php 电子签名
  • 英文描述什么是利润表
  • 增值税专用发票电子版
  • 原始凭证分割单样本图片
  • 其他综合收益 综合收益
  • 开源 okr
  • python中返回结果为true
  • 在建工程转固定资产摘要怎么写
  • 未认证的进项税额会计分录
  • 有进项发票没有销项发票怎样做账
  • 入股投资的钱能取出来吗
  • 新注册的公司在企查查上查不到
  • 一次性伤残就业补助金怎么领取
  • 当月工资总额如何计算
  • 装修费可以一次性入账吗
  • 出口退税进项票跨月勾选
  • 制造费用和管理费用怎么结转
  • 材料人工制造费用是什么成本
  • 费用报销单如何审核
  • 什么是递延所得税资产
  • 国库单一账户体系包括哪些账户
  • Win9传闻汇总:通知中心+免费下载+手势功能等
  • 侧边栏应用
  • xampp3.2.4安装教程与配置
  • win10系统如何打开运行命令
  • ubuntu系统如何安装
  • RSync文件备份同步 Linux服务器rsync同步配置图文教程
  • ubuntu常用操作
  • linux www服务器配置
  • jgcx是什么软件的文件
  • centos7视频教程
  • keyemain.exe是什么
  • linux创建目录函数
  • win10周年版
  • zlib是什么意思
  • linux怎么cd
  • 电脑启动项清理
  • 怎么查看u盘有没有传输过数据
  • 批处理应用实例
  • jquery?
  • node express 路由
  • 江苏省地方税务局网上办税
  • 网上申报成功怎么查询
  • 财税刘毅
  • 税控盘连接服务器失败是什么原因黑盘发票无法上传
  • 农业银行联行号查询系统官网
  • 期初未缴税额是什么意思
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设