2017-03-15 100 views
0

我使用onConnection钩子和一些模板助手来做一些统计的东西。但是现在,当我是注册用户时,我不想排除这些操作。 问题,我不能在onConnection钩子中使用Meteor.user(),所以我如何检查用户是否登录?流星:onConnection,检查用户是否登录

关于代码,没有太多展示

Meteor.onConnection(function(conn) { 
if(Meteor.user()) { 
    console.log("you are logged in") 
} else { 
    console.log("u are not logged in") 
} 
}); 

这不是真实的例子,但它显示了简单的就是我想要做的 的错误

err [Error: Meteor.userId can only be invoked in method calls. Use this.userId in publish functions.] 

我明白,我可以在方法中使用Meteor.user(),但如何在onConnection中找到用户是否登录?

+0

发布订阅API显示你已经尝试了代码,请。 – zim

+0

@zim添加了一个示例 – equalsound

+0

您是否尝试使用this.userId,如错误消息中所示? – zim

回答

0

显然如您所述,流星文档没有提供任何有关如何实现这一目标的见解。我花了相当长的时间通过accounts-base来源,并没有看到任何方式来做你本来要求的。

即便如此,如果您每次登录并保存其当前IP地址时都可以更新Users集合,那么您可以使用它来查看当前连接是否已登录。以下是一个示例。

Meteor.onConnection((connection) => { 
    var user = Meteor.users.findOne({ 
    'user.profile.currentIp': connection.clientAddress 
    }); 

    if (user) { 
    console.log("you are logged in") 
    } else { 
    console.log("u are not logged in") 
    } 
}); 

务必添加登录和注销挂钩来设置和删除用户的当前IP。我没有测试过这种方法,但理论上它应该起作用。

+0

是否有可能在客户端使用onConnection? – Ruben

+0

不可以,只能在服务器上使用 – jordanwillis

+1

@Ruben有一个'Meteor.connection'对象,你可以在客户端访问...也许它里面有类似的方法吗?我之前使用它来向控制台打印所有DDP传入/传出消息。 – jordanwillis

0

出于统计目的,我建议使用出版物。他们有更复杂的API,可以让你更好地控制连接。

Meteor.publish('users.trackPresence', function() { 
    // Both this.userId && this.connection are available to be called from here 

    self.onStop(function(){ 
    // user went offline 
    }); 

    this.ready(); 
}); 

和客户端,你可以检查用户是否存在,且即使不认购,如果是这种情况的:当您从Tracker.autorun内订阅

Tracker.autorun(function(){ 
    if (!Meteor.userId()) 
    Meteor.subscribe('users.trackPresence'); 
}); 

流星自动处理取消/重新订阅

此处详细了解 https://docs.meteor.com/api/pubsub.html