我有一个非常简单的nodejs应用程序(请参见下面的代码),用于直接将文件上传到以前发布在SO上的S3存储桶中。这在我的本地计算机上(以及从Cloud9工作区)完美运行,表明我的S3存储桶等已正确设置,但是当我将其部署在heroku上时,出现内部服务器错误。日志中的错误为“错误:在TCPConnectWrap.afterConnect上以ECONNREFUSED 169.254.169.254:80连接[完成时](net.js:1117:14)。从我在浏览器中看到的文件上传百分比来看,文件上传似乎开始了,但是当达到100%时,我收到了错误消息。我的AWS凭证存储在heroku上的环境变量中,这是我在本地使用的凭证。我意识到heroku建议使用XMLHttp来执行此操作,但我更愿意在可能的情况下使用此代码。关于Heroku的我有什么遗漏,不会让请求完成吗?预先非常感谢。
var express = require('express'),
aws = require('aws-sdk'),
bodyParser = require('body-parser'),
multer = require('multer'),
multerS3 = require('multer-s3');
aws.config.update({
accessKeyId: process.env.AWS_ACCESS_KEY_ID,
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
region: 'us-east-2',
});
var app = express(),
s3 = new aws.S3();
app.use(bodyParser.json());
var upload = multer({
storage: multerS3({
s3: s3,
bucket: process.env.S3_BUCKET,
key: function (req, file, cb) {
cb(null, file.originalname);
}
})
});
app.get('/', function (req, res) {
res.sendFile(__dirname + '/index.html');
});
app.post('/upload', upload.array('upl',1), function (req, res, next) {
res.send("Uploaded!");
});
app.listen(process.env.PORT, process.env.IP, function(){
console.log("Server has started");
});`
表单是:
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
</head>
<body>
<form method="post" enctype="multipart/form-data" action="/upload">
<p>
<input type="text" name="title" placeholder="optional title"/>
</p>
<p>
<input type="file" name="upl"/>
</p>
<p>
<input type="submit"/>
</p>
</form>
</body>
</html>