簡體   English   中英

嘗試使用 Node 將圖像上傳到 S3 時,為什么會出現此連接錯誤?

[英]Why am I getting this connection error when trying to upload an image to S3 with Node?

我正在創建一個聊天應用程序,並希望將不同的聊天服務器圖像保存到 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 的其他示例,但沒有一個解決方案有助於解決我的問題。


儀表板.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;

管理.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;

我設法通過向 S3 存儲桶添加Bucket Policy來解決該問題。

對於可能有類似問題的其他人,我是這樣做的:

  1. 單擊右上角的用戶名,然后選擇“我的帳戶”
  2. 記下您的Account ID ,該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 textarea 中,然后按保存

您現在應該可以訪問您的 S3 存儲桶。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM