这里的API主要是管理服务端和客户端间通信。
这个函数主要是获取当前的连接状态。 在Client端使用。它的返回结果是一个Object对象。它是一个活性数据源。先看代码:
meteor create API-004 #创建工程 cd API-004 mkdir client #创建文件夹 mv API-004.js client/ #移动文件 mv API-004.html client/ #移动文件 rm *.css #移除文件
client/API-004.js:
Template.hello.greeting = function () { return EJSON.stringify(Meteor.status()); };
client/API-004.html:
<head> <title>API-004</title> </head> <body> {{> hello}} </body> <template name="hello"> <h1>Hello World!</h1> {{greeting}} </template>
启动应用并打开浏览器 localhost:3000查看结果
{"status":"connected","connected":true,"retryCount":0}
这个是连接状态的对象,现在保持浏览器打开状态,后用Ctrl+C结束应用,在看页面的变化,类似这样的结果(可以看到浏览器在不断的刷新,页面数据不断的改变):
{"status":"waiting","connected":false,"retryCount":2,"retryTime":1396850850849.2966}
在重新启动应用,稍等一会后可以看到结果:(ps:因为当连接中断后,meteor不是以固定的频率去重新尝试链接后台,而是一个递增的时间去尝试,如第一次可能只有1秒,没有连接上就会等3秒在去尝试连接,如果还没连接上就会等6秒,越往后去尝试连接的频率越低)
{"status":"connected","connected":true,"retryCount":0}
可以看到这个对象主要的属性有
如果当前是与服务器已经连接上了的话为true。否则为false。如果没有链接上,即值为false时,这个方法会一直调用直到链接上。
这个属性描述的是当前的连接状态,可能的值是 “connected”(已经连接上了),”connecting”(没有连接上服务器,正在尝试打开新的连接),”failed”(连接失败。例如客户端和服务端的DDP版本不同,导致无法解析数据,连接失败),”waiting”(连接失败,等待重新尝试链接),”offline”(用户处于离线状态)
当失去连接后客户端已经尝试连接的次数。当连接上时,这个值为0
下次才是连接的时间点,单位毫秒。这个属性只有当status为”waiting”时才有。通过这个可以知道下次尝试链接的时间是多少如:
new Date(retryTime)
或者还要等待多少秒才会连接:
(retryTime - (new Date()).getTime())/1000
看下代码:
修改client/API-004.js:
Template.hello.greeting = function () { return EJSON.stringify(Meteor.status()); }; Template.hello.time = function () { var status = Meteor.status(); var retryTime = status.retryTime; if(!retryTime){ return {} } var date = (new Date(retryTime)).toString(); var second = Math.floor(retryTime - (new Date()).getTime()) / 1000; return { date:date, second:second } };
修改client/API-004.html
<head> <title>API-004</title> </head> <body> {{> hello}} </body> <template name="hello"> <h1>Hello World!</h1> {{greeting}} <br> <br> <br> {{#with time}} 下次尝试连接的时间是:{{date}}<br> 下次尝试链接等待的秒数是:{{second}} {{/with}} </template>
自己尝试断开服务器和重链接效果。
当status的值是”failed”时,它会给出连接失败的原因。现在我暂时没办法把这个字段暂时出来,如果你有处理方法可以让它显示出来,请在博客下留言。
因为 Meteor.status()是一个活性数据源,所以你可以把数据绑定到Template上面去,当它值改变时 就可以马上反应到界面上去。在需要当客户端与服务器断开时,可以利用这个函数来提醒用户。
上面已经说过了,当没有连接上时,客户端会每隔一段时间自动连接服务器。如果你想强制尝试连接的话就可以调用这个方法。当处于链接状态时,这个方法不会做任何事情。
你可以这样来测试这个方法。把服务端关闭,在浏览器控制台输入Meteor.reconnect(),会看到界面上的retryTime等属性值会马上变化。这就是强制刷新与服务端的连接了。
既然有了强制连接服务端而不是让自动去尝试连接,那么也自然后强制断开服务器的连接了。这个函数就是强制断开与服务器的连接。调用这个方法后,会停止所以活性数据的更新。客户端也不会接收任何更新数据了。当后台代码改变时,页面也不会有任何变化,代码热部署的影响也就被禁了。当前每隔一段时间自动尝试连接服务器的功能也会被禁止。这是status的状态是offline
。可以通过Meteor.reconnect
来回复连接状态。当实时数据变化不是一定需要时,这可以为移动设备保持电量。如果长期不断的更新数据会带来电量消耗。也可以自己在控制台尝试一下,看看实际效果如何。
当有一个新的客户连接到服务器时,调用该函数注册的回调函数(类似一个连接监听器)
这个函数有一个返回值,是一个带有stop函数的对象。当调用了stop函数后,里面的回调函数就会停止,当新的连接来时不会在执行。
回调函数接收一个对象参数,我们通过代码来看看实际效果。
在应用根目录下创建一个server文件夹,新建一个js文件server.js
代码如下:
server.js:
var conn = Meteor.onConnection(function(connection){ /* lbacks will be called again, and the new connection will have a new connection id. 官方文档提到了。当一个客户端重新链接到服务器时,它会重新分配一个uuid.这里包括了断线重连,页面刷新等。 在后面的版本中将改变这个策略,客户端重新连接的话会保持这个id标志符不变。当前这个回调函数也不会在执行。只有当是一个全新的连接时,才会执行它。 */ var uuid = connection.id; //连接的uuid 每个连接都有一个自己的uuid 类似java里面的sid. console.log("当前这个连接的uuid 是:" +uuid); //connection.close() //关闭这个连接 通过调用它也会关闭这个链接 //通过定时器来模拟某种需要关闭的情况。如:ip来源不合法等。当然客户端的还是会进行尝试连接到此。 //可以看到10秒后,页面将会改变 var closeTest = function(){ connection.close(); } //这个Meteor.setTimeout 类似于原生js的setTimeout,不过原生的setTimeout可能会出现预料之外的结果,因此推荐Meteor封装后的。 Meteor.setTimeout(closeTest,10000); //当连接断开后会执行里面的回调函数,如果连接已经处理关闭状态,那么这个回调函数会立即执行。 //包括在客户端断网,刷新页面等情况或者调用Meteor.disconnect()等方法都会触发这个回调函数函数。 connection.onClose(function(){ console.log("连接已关闭") }); //客户端ip地址,可以利用这个东西来拒绝一些访问请求。根据实际情况灵活应用吧。 /** 注意:下面这段话翻译自文档。我没有亲自实验过。请各位自行验证。如有翻译不正确的地方,可以在我博客下方留言,我会改正。 如果你的meteor工程在另外一个代理后(例如挂在了nginx后面),为了正确的获取到客户端的ip地址 你需要设置环境变量HTTP_FORWARDED_COUNT 设置 HTTP_FORWARDED_COUNT为一个整数来表示前面经过了几层代理 .例如代理只有一层时,你应该设置它的值为1. */ var clientAddress = connection.clientAddress; console.log("客户端ip是:"+clientAddress); //这个是http头信息,不包括Cookie var httpHeaders = connection.httpHeaders; console.log("http头是:"+EJSON.stringify(httpHeaders)); }); //当调用conn.stop()后, 上面onConnection里面的回调函数都不会执行了。 //下面通过一个定时器来模拟某种需要关闭的情况 function abc(){ conn.stop(); } //10秒后停止监听。在期间我们不断刷新页面来看打印效果,10秒再刷新页面就不会出现打印了。 //可以取消下面的这行注释看效果 //Meteor.setTimeout(abc,10000);
代码下载地址:http://download.csdn.net/detail/a6383277/7156971
或者关注我的github项目Lesson(博客原文和代码 位于Meteor目录内):
github.com/huyinghuan/Lesson
转载请注明出处谢谢!