无法连接到 S3,在 Heroku Express/Node 应用程序上使用 Cloudcube 插件

Can't connect to S3, using Cloudcube Addon on Heroku Express/Node App

我正在测试我的 Heroku 设置和连接,并将 CloudCube 添加到我的 Express/Node 应用程序以将其用于存储。

我想通过我的实时 Heroku 应用程序连接以启用文件存储,我将一个名为 Cloudcube 的插件附加到我的 Heroku 应用程序,它在他们的 S3 存储桶中为我提供了一个具有环境访问凭据的多维数据集。很确定我正确使用了凭据。

几个小时以来,我一直在尝试让此连接正常工作。

到目前为止我尝试了什么:

我在 aws-sdk、multer 和 multer-s3 上安装了 npm,需要它们,然后按照建议使用它,但切换了我的凭据,并在上传功能设置中添加了一个 "dest" 键指向 Cloudcube 存储桶中我的子多维数据集和所需目录,这是我对如何操作的最佳猜测:

aws.config.update({
  secretAccessKey: process.env.CLOUDCUBE_SECRET_ACCESS_KEY,
  accessKeyId: process.env.CLOUDCUBE_ACCESS_KEY_ID,
  region: "eu-west-1"
});

const s3 = new aws.S3();

const upload = multer({
  dest: "yutqk2v0mx6h/public/",
  storage: multerS3({
    s3: s3,
    bucket: "cloud-cube-eu",
    key: function(req, file, cb) {
      console.log(file);
      cb(null, file.originalname); //use Date.now() for unique file keys
    }
  })
});

我正在使用之前共享的Whosebug post中解释的测试路线对此进行测试,如下:

//open in browser to see upload form
app.get('/', function (req, res) {
  res.sendFile(__dirname + '/index.html');
});

//use by upload form
app.post('/upload', upload.array('upl',1), function (req, res, next) {
  res.send("Uploaded!");
});

我尝试了很多不同的变体,但都没有成功。

你可以在这里看到我完整的后端测试仓库:https://github.com/malkhuzayyim/hasad-backend

它有一些来自之前设置测试的额外代码,其他一切正常,只是静态文件上传失败。

尝试上传时,我在我的 heroku 日志仪表板上获得了这些日志:


2019-01-05T01:10:33.693468+00:00 heroku[router]: at=info method=GET path="/" host=hasad-backend.herokuapp.com request_id=782646c6-e150-44a5-bfb6-ff6a4b54c147 fwd="95.218.80.131" dyno=web.1 connect=0ms service=9ms status=200 bytes=899 protocol=https
2019-01-05T01:10:47.797075+00:00 app[web.1]: { fieldname: 'upl',
2019-01-05T01:10:47.797094+00:00 app[web.1]:   originalname: '1f227fe3048fdf82d4dc52ca577c381d.jpg',
2019-01-05T01:10:47.797096+00:00 app[web.1]:   encoding: '7bit',
2019-01-05T01:10:47.797098+00:00 app[web.1]:   mimetype: 'image/jpeg' }
2019-01-05T01:10:47.906948+00:00 app[web.1]: AccessDenied: Access Denied
2019-01-05T01:10:47.906951+00:00 app[web.1]:     at Request.extractError (/app/node_modules/aws-sdk/lib/services/s3.js:585:35)
2019-01-05T01:10:47.906953+00:00 app[web.1]:     at Request.callListeners (/app/node_modules/aws-sdk/lib/sequential_executor.js:106:20)
2019-01-05T01:10:47.906955+00:00 app[web.1]:     at Request.emit (/app/node_modules/aws-sdk/lib/sequential_executor.js:78:10)
2019-01-05T01:10:47.906956+00:00 app[web.1]:     at Request.emit (/app/node_modules/aws-sdk/lib/request.js:683:14)
2019-01-05T01:10:47.906958+00:00 app[web.1]:     at Request.transition (/app/node_modules/aws-sdk/lib/request.js:22:10)
2019-01-05T01:10:47.906959+00:00 app[web.1]:     at AcceptorStateMachine.runTo (/app/node_modules/aws-sdk/lib/state_machine.js:14:12)
2019-01-05T01:10:47.906961+00:00 app[web.1]:     at /app/node_modules/aws-sdk/lib/state_machine.js:26:10
2019-01-05T01:10:47.906963+00:00 app[web.1]:     at Request.<anonymous> (/app/node_modules/aws-sdk/lib/request.js:38:9)
2019-01-05T01:10:47.906964+00:00 app[web.1]:     at Request.<anonymous> (/app/node_modules/aws-sdk/lib/request.js:685:12)
2019-01-05T01:10:47.906966+00:00 app[web.1]:     at Request.callListeners (/app/node_modules/aws-sdk/lib/sequential_executor.js:116:18)
2019-01-05T01:10:47.906967+00:00 app[web.1]:     at Request.emit (/app/node_modules/aws-sdk/lib/sequential_executor.js:78:10)
2019-01-05T01:10:47.906968+00:00 app[web.1]:     at Request.emit (/app/node_modules/aws-sdk/lib/request.js:683:14)
2019-01-05T01:10:47.906969+00:00 app[web.1]:     at Request.transition (/app/node_modules/aws-sdk/lib/request.js:22:10)
2019-01-05T01:10:47.906971+00:00 app[web.1]:     at AcceptorStateMachine.runTo (/app/node_modules/aws-sdk/lib/state_machine.js:14:12)
2019-01-05T01:10:47.906973+00:00 app[web.1]:     at /app/node_modules/aws-sdk/lib/state_machine.js:26:10
2019-01-05T01:10:47.906974+00:00 app[web.1]:     at Request.<anonymous> (/app/node_modules/aws-sdk/lib/request.js:38:9)
2019-01-05T01:10:47.906976+00:00 app[web.1]:     at Request.<anonymous> (/app/node_modules/aws-sdk/lib/request.js:685:12)
2019-01-05T01:10:47.906977+00:00 app[web.1]:     at Request.callListeners (/app/node_modules/aws-sdk/lib/sequential_executor.js:116:18)
2019-01-05T01:10:47.906979+00:00 app[web.1]:     at callNextListener (/app/node_modules/aws-sdk/lib/sequential_executor.js:96:12)
2019-01-05T01:10:47.906980+00:00 app[web.1]:     at IncomingMessage.onEnd (/app/node_modules/aws-sdk/lib/event_listeners.js:299:13)
2019-01-05T01:10:47.906982+00:00 app[web.1]:     at IncomingMessage.emit (events.js:187:15)
2019-01-05T01:10:47.906984+00:00 app[web.1]:     at IncomingMessage.EventEmitter.emit (domain.js:441:20)
2019-01-05T01:10:47.906764+00:00 heroku[router]: at=info method=POST path="/upload" host=hasad-backend.herokuapp.com request_id=d025c4df-2a09-4a5b-bad8-f4a349cf3aa4 fwd="95.218.80.131" dyno=web.1 connect=1ms service=121ms status=403 bytes=560 protocol=https

可在此处查看 Multer S3 文档:https://www.npmjs.com/package/multer-s3

您还可以在此处查看 Cloudcube 文档:https://devcenter.heroku.com/articles/cloudcube

我的 api 在 https://hasad-backend.herokuapp.com/

直播

我真的需要让它工作,因为我计划在未来的项目中使用这个设置,并且我正在使用这个课程作为代理来熟悉这个设置。

关于 link Heroku Express API 到 Cloudcube 的最佳方法有什么建议吗?

非常感谢您的帮助。

非常感谢。

最佳,

MK

我明白了,一切就绪,我只是错误地解析了路径的目的地,这使得 cloudcube 拒绝了我的上传,因为我的 "storage cube" 在技术上是他们 S3 存储桶中的一个子目录.

错误是:

const upload = multer({
  dest: "yutqk2v0mx6h/public/",
  storage: multerS3({
    s3: s3,
    bucket: "cloud-cube-eu",
    key: function(req, file, cb) {
      console.log(file);
      cb(null, file.originalname);
        }
    })
});

解析我的文件存储目录的正确方法是在 multerS3 的关键函数中将其添加到我的文件名中:

const upload = multer({
  storage: multerS3({
    s3: s3,
    bucket: "cloud-cube-eu",
    key: function(req, file, cb) {
      console.log(file);
      const myFileName = "yutqk2v0mx6h/public/" + Date.now();
      console.log(myFileName);
      cb(null, myFileName);
    }
  })
});

来自 cloudcube 电子邮件支持的回复暗示了解决方案,我一尝试它就立即起作用。

感谢斯科特,我会把它留在这里,以防其他人经历 Heroku/S3 设置。

最佳,

MK