【问题标题】:Why am I getting this connection error when trying to upload an image to S3 with Node?为什么在尝试使用 Node 将图像上传到 S3 时出现此连接错误?
【发布时间】:2020-01-03 01:56:23
【问题描述】:

我正在创建一个聊天应用程序,并希望将不同的聊天服务器图像保存到 S3 存储桶。

我有一个简单的 HTML 表单,允许我选择将服务器名称、类别和图像 url 保存到 mongoDB。该图像也应该上传到我的 S3 存储桶,但在我的节点控制台中,我收到以下错误:

Error: connect ENETUNREACH 169.254.169.254:80 at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1097:14)

我正在使用 multers3 和 aws-sdk。

为什么会出现此错误?我查看了关于 SO 的其他示例,但没有一个解决方案有助于解决我的问题。


dashboard.ejs

<div class="container">
    <form action="/dashboard" method="post" enctype="multipart/form-data">
        <input type="text" name="server" placeholder="Server Name">
        <input type="text" name="category" placeholder="Category">

        <button class="btn btn-lg btn-outline-info" type="button" id="uploadBtn">Upload Image</button>
        <input type="file" name="upload" id="uploadInput" style="display: none">

        <button>Add Server</button>
    </form>
</div>

awsUpload.js

const AWS = require('aws-sdk');
const multer = require('multer');
const multerS3 = require('multer-s3');

AWS.config.update({
    accessKeyId: process.env.AWS_ACCESS_KEY_ID,
    secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
    region: process.env.AWS_REGION
});

const s0 = new AWS.S3();
const upload = multer({
    storage: multerS3({
        s3: s0,
        bucket: 'chapp-images-server',
        acl: 'public-read',
        metadata: function(req, file, cb){
            cb(null, {fieldName: file.fieldname});
        },
        key: function(req, file, cb){
            console.log(file);
            cb(null, file.originalname);
        }
    }),

    rename: function (fieldname, filename) {
        return filename.replace(/\W+/g, '-').toLowerCase();
    }
});

exports.Upload = upload;

admin.js

module.exports = function(formidable, Server, aws){
    return {
        setRoute: function(router){
            router.get('/dashboard', this.adminPage);

            router.post('/uploadFile', aws.Upload.any(), this.uploadFile);
            router.post('/dashboard', this.adminPostPage);
        },

        adminPage: function(req, res){
            res.render('admin/dashboard');
        },

        adminPostPage: function(req, res){
            const newClub = new Server();
            newClub.name = req.body.server;
            newClub.category = req.body.category;
            newClub.image = req.body.upload;
            newClub.save((err) => {
                res.render('admin/dashboard');
            })
        },

        uploadFile: function(req, res) {
            const form = new formidable.IncomingForm();

            form.on('file', (field, file) => {

            });
            form.on('error', (err) => {

            });
            form.on('end', () => {

            });

            form.parse(req);
        }
    }
};

我想我已经包含了所有相关文件,如果更容易我可以上传一个链接到我的 GitHub 存储库。

我已经尝试了以下方法:

  • 删除了我的 AWS accesskey 和 secretaccesskey 的环境变量并手动输入了它们
  • 从表单中删除了enctype="multipart/form-data"
  • 更改了我的存储桶以允许公共访问(以防出现访问问题)
  • 创建新的 S3 存储桶并改用该存储桶

编辑: .env

AWS_ACCESS_KEY_ID=key
AWS_SECRET_ACCESS_KEY=key
AWS_REGION=eu-west-2
export AWS_SDK_LOAD_CONFIG=1;

【问题讨论】:

标签: javascript node.js amazon-s3 multer


【解决方案1】:

我设法通过将Bucket Policy 添加到我的 S3 存储桶来解决此问题。

对于可能有类似问题的其他人,我就是这样做的:

  1. 点击右上角的用户名并选择“我的帐户”
  2. 记下您的Account ID,它应该位于页面顶部
  3. 导航到您的 S3 存储桶并选择您希望向其中添加存储桶策略的存储桶
  4. 选择Permissions 选项卡并选择Bucket Policy 按钮
  5. 点击存储桶策略编辑器窗口下方的Policy generator 链接
  6. 将打开一个带有一些选项的新窗口,填写以下字段:

    • Select Type of Policy: S3 Bucket Policy
    • Principal: arn:aws:iam::&lt;YOURACCOUNTID&gt;:root
    • Actions: Tick the "All Actions" tickbox next to it
    • Amazon Resource Name (ARN): Your S3 ARN which can be found in the Bucket Policy window near the top. It will look similar to this -&gt; arn:aws:s3:::BUCKETNAME
  7. 输入所有值后,您应该能够按下“添加语句”按钮

  8. 现在按下页面底部的“生成策略”按钮,它应该会打开一个包含一些 JSON 的窗口
  9. 复制此 JSON 并将其粘贴到您的 Bucket policy editor 文本区域并按保存

您现在应该可以访问您的 S3 存储桶了。

【讨论】:

  • 很高兴它为您工作。但这将使您帐户的所有用户都可以访问此存储桶。
猜你喜欢
  • 2012-03-09
  • 1970-01-01
  • 2021-06-23
  • 2021-02-24
  • 2015-10-08
  • 2011-12-22
  • 2023-03-22
  • 2013-03-07
  • 2021-09-10
相关资源
最近更新 更多