我使用Meteor和Cloudinary来显示上传和显示个人资料图片。
问题 删除配置文件图像后(通过图像ID),字段profilepicId保持不变,但显示未定义。因此帮助者似乎无法获取profilepicId是否存在并且不断显示Gravatar(虽然是上传的图像)或者在删除图像时不显示任何gravatar。
使用Mongol,该字段显示"profilepicId": {}
个人资料
{{#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
}
}
});
答案 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' });
});
});
除非有一些我不理解的东西(很可能是由于#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': '',
},
});