我正在尝试使用this指南测试上传功能,唯一的例外是使用cfs-s3包。这是非常基本的简单代码,但我在客户端控制台上收到错误 - Error: Access denied. No allow validators set on restricted collection for method 'insert'. [403]
即使我已经以各种可能的方式设置allow insert
,我也会收到此错误。
这是我的客户代码:
// client/images.js
var imageStore = new FS.Store.S3("images");
Images = new FS.Collection("images", {
stores: [imageStore],
filter: {
allow: {
contentTypes: ['image/*']
}
}
});
Images.deny({
insert: function(){
return false;
},
update: function(){
return false;
},
remove: function(){
return false;
},
download: function(){
return false;
}
});
Images.allow({
insert: function(){
return true;
},
update: function(){
return true;
},
remove: function(){
return true;
},
download: function(){
return true;
}
});
主页上有一个简单的文件输入按钮 -
// client/home.js
'change .myFileInput': function(e, t) {
FS.Utility.eachFile(e, function(file) {
Images.insert(file, function (err, fileObj) {
if (err){
console.log(err) // --- THIS is the error
} else {
// handle success depending what you need to do
console.log("fileObj id: " + fileObj._id)
//Meteor.users.update(userId, {$set: imagesURL});
}
});
});
}
我已经在S3上设置了正确的政策和所有内容,但我并不认为这个错误与S3有关。
// server/images.js
var imageStore = new FS.Store.S3("images", {
accessKeyId: "xxxx",
secretAccessKey: "xxxx",
bucket: "www.mybucket.com"
});
Images = new FS.Collection("images", {
stores: [imageStore],
filter: {
allow: {
contentTypes: ['image/*']
}
}
});
我也已适当地发布和订阅了这些收藏品。我一直在挖掘几个小时,但似乎无法弄清楚发生了什么。
编辑:我刚读了insecure
个包,现在一切正常。所以基本上,问题是允许/拒绝规则,但我实际上是这样做的。我不确定为什么它不承认规则。
答案 0 :(得分:4)
您需要在仅服务器代码中定义FS.Collection的allow/deny规则。这些是应用于FS.Collection创建的基础Mongo.Collection的服务器端规则。
最佳方法是将AWS密钥导出为以下环境变量:AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY,从FS.Store中删除accessKeyId和secretAccessKey选项,然后移动FS.Collection构造函数调用以在客户端和服务器。 cfs:s3页
中提到了使用env vars的便利性除此之外,您还可以使用Meteor.settings.public来控制存储桶名称,当您想根据环境使用不同的存储桶时,这很方便。