[英]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 存儲庫。
我已經嘗試了以下方法:
enctype="multipart/form-data"
編輯: .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
來解決該問題。
對於可能有類似問題的其他人,我是這樣做的:
Account ID
,該Account ID
應位於頁面頂部Permissions
選項卡,然后選擇Bucket Policy
按鈕Policy generator
鏈接將打開一個帶有一些選項的新窗口,填寫以下字段:
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
輸入所有值后,您應該可以按“添加語句”按鈕
Bucket policy editor
textarea 中,然后按保存您現在應該可以訪問您的 S3 存儲桶。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.