发布和订阅无法正常工作

Posted

技术标签:

【中文标题】发布和订阅无法正常工作【英文标题】:Publish and Subscribe do not work correctly 【发布时间】:2016-10-06 08:19:50 【问题描述】:

发布和订阅不起作用。请在下面找到解决方案作为答案。

最初的问题: 我正在尝试发布使用 Meteor 中的帐户 facebook 包登录时自动检索的 facebook first_name(存储在 services.facebook 下的用户集合中)。我已删除自动发布和不安全。

到目前为止我尝试过的看起来是这样的:

服务器端

Meteor.publish("facebook_name", function() 
return Meteor.users.find(_id: this.userId, 
  fields: 'services.facebook.first_name' : true );
);

客户端

Meteor.subscribe('facebook_name');

我在模板中使用的是这个

<div class="Name"><p>currentUser.services.facebook.first_name</p></div>

在删除自动发布之前,模板中显示的名称。

【问题讨论】:

你试过 fields: 'services.facebook.first_name' : 1 吗? 是的,我试过了,没有改变任何东西 您的订阅在哪里?可以出示一下代码吗? 这是我现在拥有的第一个订阅。到目前为止它在 client/main.js 中。 【参考方案1】:

当用户通过 facebook oauth API 登录并使用流星帐户-facebook 实现身份验证时,所有需要的数据都存储在当前用户对象 ( Meteor.user() ) 中。

因此,在您的案例中,用户的架构类似于:


  "_id": "Ap85ac4r6Xe3paeAh",
  "createdAt": "2015-12-10T22:29:46.854Z",
  "services": 
  "facebook": 
    "accessToken": "XXX",
    "expiresAt": 1454970581716,
    "id": "XXX",
    "email": "ada@lovelace.com",
    "name": "Ada Lovelace",
    "first_name": "Ada",
    "last_name": "Lovelace",
    "link": "https://www.facebook.com/app_scoped_user_id/XXX/",
    "gender": "female",
    "locale": "en_US",
    "age_range": 
      "min": 21
    
  ,
"resume": 
  "loginTokens": [
    
      "when": "2015-12-10T22:29:46.858Z",
      "hashedToken": "XXX"
    
  ]
 
,
"profile": 
  "name": "Sashko Stubailo"
 

因此,如果要检索用户名,只需将当前用户发布到客户端,然后从用户对象中获取用户名。

// server
Meteor.publish("userData", function () 
  return Meteor.users.find(_id: this.userId);
);

// client
Meteor.subscribe("userData");

Template.templateName.helpers(
 // this function returns username
 Username : function()
 // if user is logged in using facebook; otherwise user is logged in using password
 if   (Meteor.user().profile.name)
   return Meteor.user().profile.name;
 else 
   return Meteor.user().username;

现在您可以在视图中显示用户名:Username

这里是more info...

【讨论】:

嘿,谢谢您的回答!我尝试了这个发布功能,但是它没有向客户端返回任何 facebook 数据。当我在控制台中查看用户对象时,它只向我显示您始终可以看到的正常数据 (id, name) 。我还希望只发布 facebook 信息的某些数据字段,而不是整个用户。【参考方案2】:

找到解决我的问题的方法:

在您的 client/main.js 中设置您的流星项目时,如果您使用的是路由和模板而不是 main.html 模板,它将显示 import './main.html';,这将阻止发布和订阅正常工作。

【讨论】:

以上是关于发布和订阅无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

嵌套在 ngIf 中时,异步管道订阅无法正常工作

AWS Amplify AppSync 订阅无法正常工作

两个用户使用一个帐户时,PayPal 订阅无法正常工作

s-s-rS 报告无法通过计划订阅工作,但可以正常工作

Pubsub.pull 请求无法正常工作 - 去吧

Laravel Cashier 新订阅 Stripe 抛出“无法确定请求哪个 URL:”错误