在NodeJS中上传文件到S3是否被阻止



我在我们的应用程序上看到了性能问题,我有点不确定上传文件到S3是否会阻止NodeJS。

我使用的是express、aws-sdk。

这里有一个使用强大的中间件。这将文件存储在req.file中,并继续到下一个执行上传到S3的中间件。

var formidable = require("formidable");
module.exports = function() {

return function(req, res, next) {
var form = new formidable.IncomingForm({
"keepExtensions": true,
"uploadDir": config.tempDir
});
form.parse(req, function(error, fields, files) {
if (error) {
return res.sendError("Error while parsing multipart-form " + error, 500);
}
req.files = files;
req.fields = fields;
next();
});
};
};

以下是使用AWS SDK 向S3发出请求的中间件

const AWS = require("aws-sdk");
const fs = require("fs");
const s3 = new AWS.S3(s3config.s3options);
const logger = require("logger");
function uploadFile(req, res, next) {

const requestId = getRequestIdFromRequestHeaders(req);
const file = options.file(req);
const contentType = options.contentType && options.contentType(req) || file.type;
const destinationPath = options.destinationPath(req);

req.s3uploaded = false;

logger.debug(requestId, "invoking uploadFile", contentType, destinationPath);

req.s3FilePath = "https://" + s3config.bucket + ".s3.amazonaws.com/" + destinationPath;

if (!options.writeConcern) {
logger.debug(requestId, "write concern not expected. Calling next");
next();
}
const stream = fs.createReadStream(file.path);
s3.upload({
"Bucket": s3config.bucket,
"ContentLength": file.size,
"Key": destinationPath,
"Body": stream,
"ContentType": contentType
}, s3config.s3options.uploadOptions, function(error) {
fs.unlink(file.path, error => {
if (error) {
logger.error(requestId, "Unable to remove file", file.path);
}
});
if (error) {
return next(error);
}
if (options.writeConcern) {
if (!req.s3uploaded) {
req.s3uploaded = true;
next();
}
}
}).on("httpUploadProgress", progress => {
logger.debug(requestId, "progress", progress.loaded, "of", progress.total);
if (progress.total !== undefined && progress.loaded === progress.total) {
logger.debug(requestId, "upload done, invoking next from httpUploadProgress");
if (!req.s3uploaded) {
req.s3uploaded = true;
next();
}
}
});
};

AWS SDK for JavaScript(v2(的文档在其"异步调用服务"页面上包括以下语句(重点是我的(:

通过SDK发出的所有请求都是异步的。在编写浏览器脚本时,请务必记住这一点。在web浏览器中运行的JavaScript通常只有一个执行线程。对AWS服务进行异步调用后,浏览器脚本将继续运行,在此过程中,可以尝试执行依赖于异步结果的代码,然后再返回。

相关内容

最新更新