尝试通过Node将图像上传到S3时为什么会出现此连接错误?

时间:2020-01-02 11:56:01

标签: javascript node.js amazon-s3 multer

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

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

我正在使用multers3和aws-sdk。

为什么会出现此错误?我在SO上看过其他示例,但是没有一种解决方案可以解决我的问题。


dashboard.ejs

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

awsUpload.js

<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>

admin.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;

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

我已经尝试了以下方法:

  • 删除了我的AWS accesskey和secretaccesskey的环境变量,并手动输入了它们
  • 从表单中删除了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); } } };
  • 将我的存储桶更改为允许公共访问(以防万一这是访问问题)
  • 创建一个新的S3存储桶并使用该存储桶

编辑: .env

enctype="multipart/form-data"

1 个答案:

答案 0 :(得分:0)

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

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

  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::<YOURACCOUNTID>: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 -> arn:aws:s3:::BUCKETNAME
  7. 输入所有值后,您应该可以按“添加语句”按钮

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

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