node.js - aws s3 节点 js sdk 方法 generatePutUrl 返回 localhost 和 heroku 上部署的不同结果
问题描述
我正在尝试根据heroku 建议管理将文件直接上传到 S3
- 第一个需要在一个服务器上生成预签名 URL
- 在客户端使用此 url 将图像从浏览器直接上传到 S3 存储桶
最后设法在本地工作。但是当我尝试在 heroku 上部署服务器时,它开始无缘无故地失败或出现可读错误。当我尝试打印时只是常见的错误和奇怪的消息
当我从本地主机或从本地主机的 heroku 响应进行调用时,预签名的 url 完全不同,这对我来说看起来很奇怪,如下所示:
https://mybucket.s3.eu-west-1.amazonaws.com/5e3ec346d0b5af34ef9dfadf_avatar.png?AWSAccessKeyId=<AWSKeyIdHere>&Content-Encoding=base64&Content-Type=image%2Fpng&Expires=1581172437&Signature=xDJcRBiA%2FmQF1qKhBZrnhFXWdaM%3D
heroku 部署的响应如下所示:
https://mybucket.s3.u-west-1.amazonaws.com/5e3ee2bd1513b60017d85c6c_avatar.png?Content-Type=image%2Fpng&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=<credentials-key-here>%2F20200208%2Fu-west-1%2Fs3%2Faws4_request&X-Amz-Date=20200208T163315Z&X-Amz-Expires=900&X-Amz-Signature=<someSignature>&X-Amz-SignedHeaders=content-encoding%3Bhost
服务器代码几乎就像在示例中一样:
const Bucket = process.env.BUCKET_NAME
const region = process.env.BUCKET_REGION
AWS.config = new AWS.Config({
accessKeyId: process.env.S3_KEY,
secretAccessKey: process.env.S3_SECRET,
region,
logger: console
})
const s3 = new AWS.S3()
async function generatePutUrl(inputParams = {}) {
const params = { Bucket, ...inputParams }
const { Key } = inputParams
const putUrl = await s3.getSignedUrl('putObject', params)
const getUrl = generateGetUrlLocaly(Key)
return {putUrl, getUrl}
}
我能想象的唯一区别是 SSL - 我运行本地服务器 VIA http,heroku 默认通过 https...
但我不明白它会如何影响这里。我将不胜感激任何有意义的建议如何调试和修复它。谢谢你。
解决方案
您的存储桶区域看起来不正确。不应该eu-west-1
代替u-west-1
吗?
推荐阅读
- c# - 如何在 IAsyncResult 方法中调用异步任务
- php - 如何在 Laravel Eloquent 中使用 groupBy 在联合查询中
- javascript - mediaDevices API 打开了错误的相机,有没有办法设置你要使用哪个相机?
- python - 比较没有相同 csv 文件标题的两列,并使用 Python 3.8 输出匹配值
- javascript - 如何拥有多个 Flip Card 3D only CSS
- javascript - 将字符串数组传递给 JavaScript indexOf()?示例:str.indexOf(arrayOfStrings)?
- javascript - 如何使用express,ejs将函数从.js模块导入节点js中的另一个.js模块
- javascript - 如何连接两个reactjs页面并显示相同的数据
- docker - Docker 中的 Xdebug CLI
- reactjs - 如何在我的 koa-server 上执行外部 api 请求,它使用 @shopify/koa-shopify-auth