当用户在Meteor和/或Iron路由器中离开页面时如何捕获?

Lau*_*ent 6 node.js meteor iron-router

用户离开我的Meteor应用程序(版本1.2.0.2)时,我试图捕获; 等同于SocketIO disconnect()服务器端的东西.

用户可以关闭他的浏览器,转到另一个网站或只是刷新页面,无论如何它都会触发

令人惊讶的是,我在互联网上搜索,一切都混乱,没有任何正常工作.我认为Meteor实际上是基于这种神奇的实时处理,所以它必须以某种方式管理这个事件.

Iron路由器文档指定:

onStop:路由停止时调用,通常在新路由运行之前.

我也找到了Router.load,Router.unload但没有一个能奏效.这是我目前[不工作]的代码,非常简单

Router.configure
  layoutTemplate: 'MasterLayout'
  loadingTemplate: 'Loading'
  notFoundTemplate: 'NotFound'

Router.onStop (->

  console.log('Try to stop')
  Users.insert({

    name: "This is a test"
    lat: 0
    lng: 0

    })

)
Run Code Online (Sandbox Code Playgroud)

我在这里做错了吗?你如何在我的应用程序中捕获此事件?

Lau*_*ent 3

有两种解决方案有效,我通过在API 文档中搜索了一段时间找到了第二个也是最好的一个。

第一个解决方案:使用订阅和发布

在控制器/前端端的任何位置,您都必须订阅一个集合

# in coffee
@subscribe('allTargets')

# in javascript
this.subscribe('allTargets')
Run Code Online (Sandbox Code Playgroud)

之后您只需发布并添加onStop侦听器即可。这个例子将采用Targets我之前在某处定义的集合,它只获取所有条目。

# in coffee
Meteor.publish 'allTargets', ->

  @onStop ->

    # Do your stuff here

  return Targets.find()

# in javascript
Meteor.publish('allTargets', function() {

  this.onStop(function() {

      // Do your stuff here

  });

  return Targets.find();

});
Run Code Online (Sandbox Code Playgroud)

return Targets.find()在设置侦听器之前,您必须小心不要这样做onStop。我认为这不是一个完美的解决方案,因为您不监听连接本身,而是监听集合的更改。

第二种解决方案:使用 DDP 连接

我意识到通过 Meteor API 文档我们可以直接监听连接并查看是否有人与服务器端断开连接。

为了在我的Meteor Iron项目中保持井井有条和干净,我添加了一个新文件app/server/connection.coffee并编写了这段代码

# in coffee
Meteor.onConnection (connection) ->

  connection.onClose ->

    # Do your stuff

# in javascript
Meteor.onConnection(function(connection) {

  connection.onClose(function() {

    // Do your stuff

  });

});
Run Code Online (Sandbox Code Playgroud)

connection.id您可以使用浏览器选项卡的唯一标识符来管理数据。两种解决方案对我来说都很有效。

如果您Meteor.userId通过他们的帐户系统使用,则无法method在服务器端之外使用它,因此我必须找到一种解决方法connection.id

如果有人有更好的解决方案来管理连接,同时获取此类客户端数据,请随时提供您的意见。