如何为不同的集合重现Meteor.user()客户端-服务器效果?

如何为不同的集合重现Meteor.user()客户端-服务器效果?,meteor,collections,user-accounts,Meteor,Collections,User Accounts,关于Meteor.user()方法在客户机和服务器上对“当前用户”的可用性,我想为不同的自定义集合重现这种功能。例如,我的应用程序使用“云”集合作为一组用户的房间类型。显然,有各种各样的cloud实例,我并不总是希望将cloudId传递到每个meteor方法中。理想情况下,我可以使用Meteor.cloud()函数,该函数将为我提供客户端和服务器上的当前云 我对这个问题的看法是: 到目前为止,我一直在做的是通过在用户配置文件中存储currentCloudId属性,并在操作之前在路由上设置该属性,

关于Meteor.user()方法在客户机和服务器上对“当前用户”的可用性,我想为不同的自定义集合重现这种功能。例如,我的应用程序使用“云”集合作为一组用户的房间类型。显然,有各种各样的cloud实例,我并不总是希望将cloudId传递到每个meteor方法中。理想情况下,我可以使用Meteor.cloud()函数,该函数将为我提供客户端和服务器上的当前云

我对这个问题的看法是:

  • 到目前为止,我一直在做的是通过在用户配置文件中存储currentCloudId属性,并在操作之前在路由上设置该属性,从而对Meteor.user()进行piggy备份。然而,这限制了用户一次只能在一个云中

  • 以某种方式使用Meteor.connection ID来保持连接ID到CloudID的映射。这在理论上是非常有效的……然而,流星连接ID似乎不能高度依赖,因为它们可能在重新连接或其他随机情况下发生变化。此外,您还必须“管理”该“cloudConnections”集合,并删除旧的过时连接等等

  • 我正在使用Iron Router…如果可以在服务器上获取当前路由数据,这也可以解决我的问题,但我不确定如何在服务器上访问该数据

  • ---基本上,我希望有一种简单直接的方法来模拟其他集合的Meteor.user()行为


    感谢您的帮助:)

    您只需在/lib中创建一个如下所示的函数:

    getUserClouds = function getUserClouds () {
      return Clouds.find({ $elemMatch: { $eq: Meteor.userId() } })
    }
    
    这将在客户端和服务器上都起作用。但它将始终返回指向0个文档的
    光标。因此,您需要一份出版物:

    Meteor.publish('userClouds', function () {
      return Clouds.find({ $elemMatch: { $eq: this.userId } })
    })
    

    每个云ID链接到什么?用户是否始终具有特定的云ID?你可以在一个用户的文档中存储一个云ID数组,然后在你订阅路由器中的内容时将其作为参考。一个云有很多用户……而一个用户有很多云。在云内部的客户端上,很容易识别cloudId,因为您只订阅了一个云,用于特定的meteor连接。但是在服务器上,只有一个cloudId数组……如果用户位于多个云中,您将不知道哪个cloudId属于哪个连接,因此当从前端调用方法时,您将不知道要在后端更新哪个云。至少您需要为每个用户(可能是其自己的集合)将Meteor ConnectionId映射到CloudId,如#2如果客户端调用Meteor方法,只需将云的ID作为参数传递到Meteor方法。然后服务器就会知道您在谈论哪个ID/云文档。编辑对不起,只是读到这正是你不想做的。我不明白这是如何解决问题的。那么你是说我应该在一个云文档上为特定云中的所有用户创建一个userid数组?从您的设置来看……这看起来只会给我一个光标,显示用户在服务器上拥有的所有云。但是,无法确定这些云中的哪一个是针对特定客户机连接处理的云(因为它们可能不止一个)