无法识别删除个人资料图片并显示gravatar

时间:2017-01-15 04:51:31

标签: javascript html meteor cloudinary

我使用Meteor和Cloudinary来显示上传和显示个人资料图片。

问题 删除配置文件图像后(通过图像ID),字段profilepicId保持不变,但显示未定义。因此帮助者似乎无法获取profilepicId是否存在并且不断显示Gravatar(虽然是上传的图像)或者在删除图像时不显示任何gravatar。

使用Mongol,该字段显示"profilepicId": {}

上传图片时的控制台(显示长度但值未定义?)
When img is uploaded and exists


删除图片时的控制台(全部未定义)
When img deleted

个人资料

{{#with currentUser}}
   {{#if profilepicId}}
       <img src="{{c.url profilepicId format=format gravity='faces' mode='thumb' crop='thumb' width=60 height=60}}">
   {{else}} 
       <div class="avatar" style="background: url({{avatar 40}}); height: 50px; width: 50px; float:left;"></div>
   {{/if}}
{{/with}}

个人资料js

Template.profile.onCreated(function(){
   var self = this;
   self.autorun(function(){
      self.subscribe('user', Meteor.userId());
      $.cloudinary.config({ cloud_name: "XX", api_key: 'XX' }); 
   });
});

Template.profile.helpers({
   user: function () {
      return Meteor.user(); 
   },
   profilepicId: function (){ 
      var u = Meteor.user().profile; 
      if( u.profilepicId === undefined || u.profilepicId === null){ 
         return false
      }
   }
});

2 个答案:

答案 0 :(得分:1)

您指出的第一件事是:

  

使用Mongol,该字段显示“profilepicId”:{}

...但是如果我明白你在说什么,那么你正在检查是否未定义。你是说,一旦删除图像,该字段是一个空的JSON对象?因为那是未定义。在这种情况下,删除图像时更新配置文件的代码在哪里?

除此之外,您的代码可以大大简化。

首先,我认为你不需要助手来获取profilepicId。您可以使用Blaze中的currentUser完成所有操作:

{{#with currentUser}}
   {{#if profile.profilepicId}}
       <img src="{{c.url profile.profilepicId format=format gravity='faces' mode='thumb' crop='thumb' width=60 height=60}}">
   {{else}} 
       <!-- gravatar -->
   {{/if}}
{{/with}}

让我们看看你的onCreated():

Template.profile.onCreated(function(){
   var self = this;
   self.autorun(function(){
      self.subscribe('user', Meteor.userId());
      $.cloudinary.config({ cloud_name: "XX", api_key: 'XX' }); 
   });
});
  1. 当用户更改时,此模板是否会更新?如果没有,为什么会有自动运行?
  2. 这个“用户”订阅是什么?它会做普通用户发布不做的事情吗?
  3. 为什么要配置cloudinary这么多次?它只需要完成一次(例如在客户端启动时)
  4. 你为什么要把api_key放在客户端?只有服务器配置才需要该数据。客户端配置只需要cloud_name。客户端上的api_key是不安全的。
  5. 除非有一些我不理解的东西(很可能是由于#2),我认为你不需要任何东西。 (当然,配置会移动到客户端启动)。

    我也不会在你需要的帮助器中看到任何东西,因为你可以在Blaze中驱逐currentUser的所有东西。

    所以,简而言之,当删除配置文件图像时,Meteor.user()。配置文件是什么样的,该代码在做什么?即该字段是真正未定义的,还是空的JSON对象?

    <强>更新

    对于Cloudinary配置,我在客户端(client / index.js)上有这个:

    Meteor.startup(() => {
        $.cloudinary.config({
            cloud_name: Meteor.settings.public.cloudinary.cloud_name
        });
    }
    

    我从设置文件中提取信息,但您可以对其进行硬编码以开始使用。

    服务器上的

    (server / startup / cloudinaryConfig.js):

    Meteor.startup(() => {
        Cloudinary.config({
            cloud_name: Meteor.settings.private.cloudinary.cloud_name,
            api_key: Meteor.settings.private.cloudinary.api_key,
            api_secret: Meteor.settings.private.cloudinary.api_secret
        });
    });
    

    设置它,我的settings.json有这样的结构:

    {
        "public": {
            "cloudinary": {
                "cloud_name": "foo"
            }
        },
        "private": {
            "cloudinary": {
                "cloud_name": "foo",
                "api_key": "xxx",
                "api_secret": "yyy"
            },
        }
    }
    

    哦,值得一提的是我正在使用这个包(我认为你使用的是相同的):https://atmospherejs.com/lepozepo/cloudinary

答案 1 :(得分:1)

删除图片后,您还应该使用profilepicId运营商删除$unset字段:

Meteor.users.update({
  _id: userId
}, {
  $unset: {
    'profile.profilepicId': '',
  },
});