Node.js 如何在Meteor和/或Iron router中捕获用户何时离开页面?

Node.js 如何在Meteor和/或Iron router中捕获用户何时离开页面?,node.js,meteor,iron-router,Node.js,Meteor,Iron Router,我正试图捕捉用户何时从我的Meteor应用程序(版本1.2.0.2)中离开;与服务器端上的SocketIO disconnect() 用户可以关闭浏览器,转到另一个网站,或者简单地刷新页面,无论如何都会触发 令人惊讶的是,我在网上搜索,所有的东西都混在一起了,没有任何东西能正常工作。我认为Meteor实际上是基于这个神奇的实时处理,所以它必须以某种方式管理这个事件 Iron router文件规定: onStop:当路由停止时调用,通常在新路由之前调用 路线正在运行 我还找到了Router.loa

我正试图捕捉用户何时从我的Meteor应用程序(版本1.2.0.2)中离开;与服务器端上的
SocketIO disconnect()

用户可以关闭浏览器,转到另一个网站,或者简单地刷新页面,无论如何都会触发

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

Iron router文件规定:

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

    })

)

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

您需要连接到路由的顶部
而不是路由器。例如:

Router.route('/', {
    onStop: function() {
        console.log("someone left the '/' route");
    }
});

另一个选项是使用顶部的
。这可能是与您提到的socketio断开连接最相似的选项。你可以找到

有两种解决方案有效,我在搜索中搜索了一会儿,找到了第二个和最好的一个

第一个解决方案:使用订阅和发布 在控制器/前端的任何位置,您都必须订阅一个集合

# in coffee
@subscribe('allTargets')

# in javascript
this.subscribe('allTargets')
之后,您只需发布并在顶部添加一个
侦听器。本例将以我之前在某处定义的
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();

});
在设置
顶部
侦听器之前,必须小心不要
返回Targets.find()
。我不认为这是一个完美的解决方案,因为你听的不是连接本身,而是集合的变化

第二种解决方案:使用DDP连接 我意识到通过Meteor我们可以直接监听连接,看看是否有人从服务器端断开连接

为了在我的项目中保持良好的组织和整洁,我在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

  });

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

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


如果有人有更好的解决方案在获取此类客户数据的同时管理连接,请毫不犹豫地提供您的意见。

感谢您的反馈,我正在尝试使其尽可能简单,因为我仍在学习所有这些,所以我一直尝试使用该路线,就像您所说的那样,但它仍然不起作用(我在同一条路线上添加了一个
加载
,它正确发射,但不是顶部的
加载
。。有什么想法吗?它在这里真的不起作用…现在我改变了位置,把它移到
库/控制器/home\u控制器。咖啡
是由熨斗产生的,里面有一个
顶部的
,我注意到了。仍然不起作用…基本上。)凯莉:他们自己的功能似乎不起作用。桌面上的路由不是运行客户端吗?publish.onStop是您在服务器上需要的。您能详细说明您的答案吗?我仍在努力搜索,但我找不到解决方法。您是想在用户离开时从客户端向服务器发送内容,还是只想让服务器发送知道用户的连接何时丢失吗?这不一定很容易。我想检测它是100%他离开的。这两种方法之间有什么区别?客户端可能明显无法传递“消息”这可能会破坏整个系统,如果你真的需要这些数据来改变一个集合,你会怎么做?我不会指望来自客户端的任何东西,不仅是安全方面的,而且还考虑到意外情况的发生。突然断开连接、浏览器崩溃和使用轮询WebSocket回退时的导航似乎是最重要的从服务器的角度来看也是如此。我知道没有真正的方法可以检测用户何时离开您的网站。我可能会根据服务器上的DDP连接状态更改状态。我正在尝试第二种方法,需要访问用户。您如何使用连接id访问用户?我无法访问用户它似乎同时存储用户id和连接id,因为其他一些包已经创建了该集合,在外部无法访问。