使用Meteor的Slingshot包在本地主机上连接Google Cloud时出现错误。

8

我正在尝试在我的网站上设置一个小的上传部分,供用户上传个人资料图片。我正在使用Google Cloud的Slingshot,并从本地主机进行测试,但是我遇到了以下错误:

OPTIONS https://mybucket.storage.googleapis.com/ net::ERR_INSECURE_RESPONSE

在此输入图片描述

我猜这个错误是由于我的CORS配置引起的,所以我尝试了各种不同的设置,但都没有效果。

这是我最近的CORS设置:

[
    {
      "origin": ["http://localhost:3000/"],
      "responseHeader": ["Content-Type"],
      "method": ["GET", "HEAD", "DELETE"],
      "maxAgeSeconds": 3600
    }
]

我也尝试过这样做:

[
    {
      "origin": ["*"],
      "responseHeader": ["*"],
      "method": ["GET", "HEAD", "DELETE"],
      "maxAgeSeconds": 3600
    }
]

仍然没有进展。错误与之前相同。

这是我为Slingshot编写的服务器代码:

if(Meteor.isServer){

// Initiate file upload restrictions
  Slingshot.fileRestrictions("userLogoUpload", {
  //Only images are allowed
  allowedFileTypes: ["image/png", "image/jpeg", "image/gif"],
  //Maximum file size:
  maxSize: 2 * 1024 * 1024 // 2 MB (null for unlimited)
});

  // Google Cloud Directives
  Slingshot.createDirective("userLogoUpload", Slingshot.GoogleCloud, {
    bucket: Meteor.settings.public.GoogleCloudBucket,
    GoogleAccessId: Meteor.settings.private.GoogleAccessId,
    GoogleSecretKey: Assets.getText("xxxxxxxxxx.pem"),
    // Uploaded files are publicly readable
    acl: "public-read",
    authorize: function(){
      if(!Meteor.userId()){
        throw new Meteor.error("Login Required", "Please log in to upload files");
      }
      return true;
    },
    key: function(file){
      let user = Meteor.users.findOne(Meteor.userId());
      return user.profile.username + "/" + file.name;
    }

});
}

这是客户端上传的启动方式:
let uploader = new Slingshot.Upload("userLogoUpload");
uploader.send(document.getElementById("upload").files[0], function(error, downloadUrl){
  if(!error){
    console.log(downloadUrl);
  } else{
    console.error('Error uploading', uploader.xhr.response);
    console.log(error);
  }
所有变量都没有问题。我的pem文件也没有问题,能够正常工作。所以要么是Google云出了问题,要么是我设置CORS文件的方式有误。
感谢任何帮助。

@carlevans719 是的,我添加了POST方法。这是我做的逻辑上的第一件事,但是没有连接成功。 - Mabeh Al-Zuq Yadeek
希望能看到完整的响应错误信息,而不是异常。但有几件事情值得注意: - Mussser
在你的CORS中,尝试使用以下内容:"method": ["GET", "POST", "PUT", "HEAD"] - Mussser
GoogleAccessId加载正常,秘钥也正常(通过控制台记录语句可以看出)。我的CORS文件肯定有问题,或者可能还有其他我不知道的问题?除了在控制台中记录日志之外,我不确定在秘钥和访问ID上执行什么其他检查。 - Mabeh Al-Zuq Yadeek
1
我转向了Amazon S3,第一次尝试就成功了,没有任何错误。我认为Google Cloud可能存在问题,而且我几乎不可能联系到他们的支持团队或与他们的工作人员进行实时交流。我想我会继续使用Amazon。 - Mabeh Al-Zuq Yadeek
显示剩余5条评论
1个回答

2
我在这里也遇到了同样的问题,但是调试情况更加糟糕。在我的Android应用程序中,上传工作正常,但在iOS中出现了相同的错误。 简而言之:不要在您的存储桶名称中使用点(用于CNAME别名)。当将其从gs://static.myapp.com重命名为gs://myapp-static时,我的工作正常。如果需要自定义域,请使用手动负载均衡器。 完整故事 我的存储桶名称为static.myapp.com,因此我可以在DNS提供商处创建一个CNAME记录,并使用自定义域来提供我的图像。
结果,上传本身是通过URL https://<bucket-name>.storage.googleapis.com进行的,该URL具有通配符*.storage.googleapis.com的SSL证书,因此我被迫将存储桶重命名为myapp-static,以使URL与证书匹配。
这会破坏CNAME方法,但您仍然可以设置手动负载均衡器来隐藏Google Cloud URL并使用自定义子域。下面是我当前负载均衡器配置的截图。

enter image description here


1
非常感谢!真的帮了我很大的忙,我被这个问题困扰了一整天! - Firdous

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接