【问题标题】:Custom fields on Meteor.users not being publishedMeteor.users 上的自定义字段未发布
【发布时间】:2013-10-15 21:20:15
【问题描述】:

我的最终目标是在模板登录后通过{{currentUser}}CUSTOM_FIELD_I_FREAKEN_WANT_TO_PUBLISH 提供给模板,但Meteor 不会发送用户集合中的所有字段。

在服务器中:

Meteor.publish('userdata', function() {
    this.ready(); // do I really even need to do this?
    //return Meteor.users.find(); //This STILL doesn't work
    return Meteor.users.findOne({_id: this.userId});
});

在客户端:

var s = Meteor.subscribe('userdata', function() { 
    console.log('userdata available');
    console.log('s.ready: '+s.ready())
});
console.log('s.ready: '+s.ready())

我可以通过直接连接到 mongo 实例并输入:db.users.find():

来验证集合中是否有字段
{
    "_id" : "N2M7Zp265vkbTBTFF",
    "createdAt" : ISODate("2013-10-15T03:29:53.155Z"),
    "CUSTOM_FIELD_I_FREAKEN_WANT_TO_PUBLISH" : "P4GRrQMixEZducmuo",
    "profile" : {
        "name" : "Jonathan Dumaine",
            ...,
    },
    "services" : {
        "facebook" : {
            ....,
        }
    }
}

在客户端验证订阅准备就绪后,用户集合上的唯一字段是_id_profile。附加字段在客户端中不可见(通过控制台Meteor.users.find().fetch()),在通过模板访问时也未定义。

这是一个错误吗?我做错了吗?

【问题讨论】:

    标签: javascript meteor


    【解决方案1】:

    this answer:

     


    默认情况下,服务器会发布用户名、电子邮件和个人资料

    所以你需要发布/订阅额外的字段。

    服务器:

    Meteor.publish('userData', function() {
      if(!this.userId) return null;
      return Meteor.users.find(this.userId, {fields: {
        permission: 1,
      }});
    });
    

    客户:

    Deps.autorun(function(){
      Meteor.subscribe('userData');
    });
    

     


     

    查看您的代码,缺少的部分是在订阅时自动运行的。如果没有它,订阅会在应用加载时调用一次,并且在用户更改时不会更改 - 例如,当他第一次设置时。

    【讨论】:

    • 哦,这是一个很好的观点,但在这种情况下它仍然无法工作,因为发布函数中没有任何反应,不是吗?它必须使用 Meteor.user() 而不是 this.userId 进行切换。如果反应性在发布功能中,是否不需要在自动运行中订阅? :|
    • 我个人使用这种解决方案(在官方流星文档中有描述),它对我很有效。如果您需要从客户端更新用户信息,则需要添加 Meteor.users.allow/deny
    • 来自文档“但是,如果登录用户发生更改,则使用新值重新运行发布功能。”所以这个答案会起作用,但有些信息是不准确的。每当用户更改时,发布将重新运行,因此客户端将获得新数据。一行发布和一行订阅可以正常工作。
    【解决方案2】:

    来自docs

    默认情况下,当前用户的用户名、电子邮件和个人资料都会发布到客户端。

    因此,为了发布您的领域,您需要执行以下操作:

    Meteor.publish('userdata', function() {
      return Meteor.users.find({}, {fields: {'CUSTOM_FIELD_I_FREAKEN_WANT_TO_PUBLISH':1}});
    });
    

    【讨论】:

    • 我理解文档中的那一行“默认情况下会发布用户名、电子邮件和个人资料,因此任何额外的 publishes 都会发布其余字段”。我认为 'userdata' 将作为默认 user 发布的补充,因为它直接引用 Meteor.users。不是这样吗?
    • 您的意思是删除限制发布到当前用户数据的搜索条件吗?
    【解决方案3】:

    你们很亲密。你有两个问题:

    1) publish 中的 ready() 调用是不必要的,因为如果您返回游标,它会自动发送。当您确实需要它时,您希望在发送完所有数据后在发布结束时调用它。

    2) 您想返回一个使用 find() 而不是 findOne() 完成的游标。

    所以你的发布将是:

    //on server
    Meteor.publish( 'userData', function(){
      return Meteor.users.find({_id: this.userId});
    });
    

    您显示的代码实际上并未测试是否已收到任何数据,因此请尝试确保这不是问题:

    //on client
    var s = Meteor.subscribe('userdata', function() { 
      console.log('userdata available');
      console.log('s.ready: '+s.ready());
      console.log('userData: ' + JSON.stringify( Meteor.users.findOne()) );
    });
    
    console.log('s.ready: '+s.ready())
    

    此外,正如 David Weldon 在他的回答中所说,您可能希望通过在您发布的 find() 中设置字段选项来指定和限制发送给客户端的字段。

    【讨论】:

      【解决方案4】:

      我认为,您可能试图从文档 http://docs.meteor.com/#accounts_oncreateuser 中找到函数 Accounts.onCreateUser()。有一个确切的例子如何将任何对象添加到用户文档中,在个人资料、电子邮件、_id 等旁边。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-09-01
        • 2015-08-15
        • 1970-01-01
        • 1970-01-01
        • 2014-08-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多