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

yqlxgs2m  于 2023-03-17  发布在  Node.js
关注(0)|答案(2)|浏览(177)

我正在测试我的Heroku设置和连接,并将CloudCube添加到我的Express/Node应用程序中以用于存储。
我想通过我的实时Heroku应用程序连接以启用文件存储,我在Heroku应用程序上附加了一个名为Cloudcube的插件,它在他们的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
    }
  })
});

我正在使用前面分享的stackoverflow帖子中解释的测试路径进行测试,如下所示:

//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日志 Jmeter 板上得到这些日志:

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/上运行
我真的需要让这个工作,因为我计划在未来的项目中使用这个设置,并使用这个课程作为代理,让自己熟悉这个设置。
关于将Heroku Express API链接到Cloudcube的最佳方法,有什么建议吗?
我真的很感激你的帮助。
非常感谢。
最好的,
马克

hjzp0vay

hjzp0vay1#

我想明白了,一切都准备好了,我只是错误地解析了路径的目的地,这使得cloudcube拒绝了我的上传,因为我的“存储立方体”在技术上是他们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);
        }
    })
});

其中作为正确的方式来解析我的文件存储目录是将其前置到我的文件名内的关键函数multerS 3:

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设置。
最好的,
马克

w1jd8yoj

w1jd8yoj2#

我正在一个sveltekit项目中使用aws-sdk,其中有heroku和cloudcube。

//file s3.js
//install aws-sdw package
import AWS from 'aws-sdk';

AWS.config.update( {
    secretAccessKey: '<your-secret-key>',
    accessKeyId: '<your-access-key-id>'
} );

export const s3 = new AWS.S3( { region: 'eu-west-1' } );
export const bucketName = 'cloud-cube-eu';
export const directory = '<your-cube>/public/';

当我使用sveltekit时,在+server.js上你可以使用这个:

//file +server.js
import { s3, bucketName, directory } from '$lib/s3'; //import of the s3.js file

export async function POST( { request } ) {

 const body = await request.json();
 const buffer = Buffer.from( body.image, 'base64' );
 let image;

 s3.upload(
  {
    Bucket: bucketName,
    Key: directory + 'image/xxxxx.png',
    Body: buffer,
    ContentType: 'image/jpeg',
  },
  ( err, data ) => {
    if ( err ) 
    {
      console.error( err );
    } 
    else
    {
      console.log( `File uploaded successfully to ${data.Location}` );
      image = data.Location;
    }
  }
 );

 return new Response( JSON.stringify( image ), { status: 200 } )
}

请注意,我的body.image是base64图像
这是我的工作希望这能帮助到别人

相关问题