S3图像在本地加载,而不是在Heroku上加载

时间:2020-09-01 15:00:40

标签: node.js express heroku amazon-s3

这是我为节点设置AWS sdk的方法,以及进行测试以查看是否存在错误的方法

AWS.config.update({
    accessKeyId: process.env.AWS_ACCESS_KEY_ID,
    secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
    region: 'us-east-2'
})
const s3 = new AWS.S3()
s3.getObject({Bucket: process.env.S3_BUCKET_NAME, Key: '201706221542580.JPG'}, function(err, data) {
    console.log('ERROR?')
    console.log(err)
})

在本地和Heroku上,变量err为null。但是,图像仅在本地加载。这是我需要解决的CORS问题吗?我将以下CORS设置放入存储桶中,希望它可以运行,但无济于事。

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
   <CORSRule>
        <AllowedOrigin>*</AllowedOrigin>
        <AllowedMethod>GET</AllowedMethod>
        <AllowedMethod>POST</AllowedMethod>
        <AllowedMethod>PUT</AllowedMethod>
        <AllowedHeader>*</AllowedHeader>
    </CORSRule>
</CORSConfiguration>

这是我在图像服务器端缩略图的方式:

app.get('/product_thumb/', (req, res, next) => {
    if (!req.query.patch) {
        return res.sendStatus(422)
    }
    res.contentType(req.query.patch);
    const stream = s3.getObject({Bucket: process.env.S3_BUCKET_NAME, Key: req.query.patch}).createReadStream()
    thumbnailImage(stream).pipe(res)
})

const thumbnailImage = (stream) => {
    let width = 100
    return gm(stream)
            .thumbnail(width)
            .stream()
}

,并在客户端上使用React:

<img src={'/product_thumb/?patch=' + props.src} onError={(e) => { e.target.onerror = null; e.target.src = "/img/missing.png" }}/>

我还尝试设置所有环境变量来模拟生产环境,甚至在本地运行heroku,但它始终在我的机器上运行。我还验证了我在S3上的配置环境变量(例如,使用process.env.AWS_VARAIABLE检索)在本地和Heroku上完全相同。

1 个答案:

答案 0 :(得分:0)

GraphicsMagick尚未安装在Heroku服务器上。添加以下buildpack后,它可以完美运行。 https://github.com/xerpa/heroku-buildpack-graphicsmagick.git