Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Meteor中尊重用户隐私设置_Meteor_Publish_Privacy - Fatal编程技术网

如何在Meteor中尊重用户隐私设置

如何在Meteor中尊重用户隐私设置,meteor,publish,privacy,Meteor,Publish,Privacy,我有一组用户定义如下: Accounts.createUser({ username:'Simon', email:'simon@email.com', profile:{ firstname:'Simon', lastname:'Surname', location:'Home Address', privacy: { location:0, emai

我有一组用户定义如下:

Accounts.createUser({
    username:'Simon', 
    email:'simon@email.com', 

    profile:{
        firstname:'Simon',
        lastname:'Surname',
        location:'Home Address',

        privacy: {
            location:0,
            emails:0 } //Location and emails are private and should not be disclosed
    }
});
我的问题是,考虑到配置文件隐私设置,如何发布此用户的记录供其他用户查看。在本例中,我将位置和电子邮件的隐私设置为零,目的是不为该用户发布此信息

我想使用标准方法发布它:

Meteor.publish("usersWithPublicEmails", function () {
    return Meteor.users.find();
});
但我看不到一种指定选择器或字段的方法,这种方法只能发布公共信息

我已尝试添加该表单的其他出版物:

Meteor.publish("allUsers", function () {
    return Meteor.users.find( {}, {fields:{username:1}} );
});

Meteor.publish("usersWithPublicEmails", function () {
    return Meteor.users.find( {"profile.privacy.emails":1}, {fields:{username:1, emails:1}} );
});

但是选择器似乎没有像我预期的那样返回电子邮件。从性能的角度来看,我正在寻找实现这一点的最佳方法。

Mongodb不是一个关系数据库,因此每当我想要加入或基于元数据进行查询时,我记得我必须以不同的方式进行操作。在你的情况下,如果我想查询用户隐私,我会为用户隐私做一个单独的收集。此外,如果我关心性能,我可能永远不会想要所有的x,我只想足够显示给用户,从而分页。有了这两个想法,您可以很容易地得到您想要的:基于隐私设置和性能的查询

Privacy = new Mongo.Collection("privacy");
无论何时我们想要为帐户添加隐私:

Privacy.insert({
  emails: 1,
  userId: account._id,
});
然后,一次一页,每页显示十个结果,使用currentPage跟踪:

我没有测试这段代码,它可能有错误,但它应该给你一个大概的想法。这里的缺点是您必须保持隐私和用户同步,但在不使用关系数据库时会遇到这些问题


Mongodb有一种方法可以用更少的代码进行这种引用查找,但它仍然是按需进行的,我更喜欢自己进行这种查找的灵活性。如果您感兴趣,请查看

,这是因为您的发布函数的fields对象中有一个输入错误,而不是您键入的电子邮件

因此,正确的功能应该是:

Meteor.publish("usersWithPublicEmails", function () {
    return Meteor.users.find( {"profile.privacy.emails":1}, {fields:{username:1, email:1}} );
});
此外,您已经在allUsers出版物中发布了所有用户名,因此,为了为相关公共用户添加缺失的数据,您只需要以下内容:

Meteor.publish("usersWithPublicEmails", function () {
    return Meteor.users.find( {"profile.privacy.emails":1}, {fields:{email:1}} );
});

Meteor将自动为您合并这些记录。

最后是一个简单的解决方案。我错过了路由器中的附加订阅:

Router.route('/users', {

    name: 'userList',

    waitOn: function(){
        return Meteor.subscribe('allUsers') &&
               Meteor.subscribe('usersWithPublicEmails');
    },

    data: function(){
        return Meteor.users.find();
    }
});

一个基本错误:-

嗨,塞尔坎,这不是打字错误。Meteor帐户允许您使用createUser方法创建电子邮件,但会针对每个用户存储多封电子邮件。我原以为流星会像你说的那样合并这些记录,但很惊讶没有发生。我一定是做错了什么。谢谢你花时间看我的问题。嗨,塞尔坎,我已经找到了。我在路由器的waitOn子句中缺少匹配的订阅:-嗨,比约恩,我已经追查到了我丢失订阅的问题所在,但这个建议真的很有用。我一直想知道如何限制返回值,这个示例非常有用。非常感谢。布劳尼乌斯,请用全体投票感谢你\比约恩,我试过了,但我没有足够的声誉-这似乎是件奇怪的事情,但你就这样做了。顺便说一句,我发现您需要使用privacyResults.forEach来循环游标。在返回之前,我找不到一种方法来操作记录集中的值-这对于我的场景来说是非常理想的。Mmm。我通过在router.js模块中添加一个缺少的订阅来实现这一点。然而,在添加了更多的隐私设置(包括出版物和订阅)后,我看到了一些奇怪的行为。在我的路由器中有4个订阅:waitOn:function{return Meteor.subscribe'allUsers'&&Meteor.subscribe'usersWithPublicName'&&Meteor.subscribe'usersWithPublicLocation'&&Meteor.subscribe'usersWithPublicEmails';},我发现第三个没有效果。更改顺序会从“我的用户”页面中删除相应的数据!我还尝试像这样指定我的waitOn:function{return[Meteor.subscribe'allUsers',Meteor.subscribe'usersWithPublicName',Meteor.subscribe'usersWithPublicLocation',Meteor.subscribe'usersWithPublicEmails'];},结果相同。
Router.route('/users', {

    name: 'userList',

    waitOn: function(){
        return Meteor.subscribe('allUsers') &&
               Meteor.subscribe('usersWithPublicEmails');
    },

    data: function(){
        return Meteor.users.find();
    }
});