node.js - express 中的 multer-s3 上传速度非常慢
问题描述
在我的 express 应用程序中通过 multer-s3 将文件上传到 S3 速度非常慢(200kb 需要 10 秒,延迟与文件大小有关)。问题是 multer-s3 但有人可以告诉如何进一步调试库中发生的事情吗?不再支持将 onFileUploadStart 等传递给 multer。我不知道如何在 multer-s3 正在做什么以及在哪个阶段引起延迟。
问题不在于 AWS S3,因为从 CLI 上传速度非常快,也不是 multer,因为上传到本地磁盘也很快。任何直接的 S3 javascript 操作也可以按预期快速运行。
尝试关闭 multer 的内容自动输入功能,但效果不大。
var upload = multer({
storage: multerS3({
s3: s3,
bucket: bucketName,
acl: 'public-read',
contentType: multerS3.AUTO_CONTENT_TYPE,
metadata: function (req, file, cb) {
cb(null, {fieldName: file.fieldname});
},
key: function (req, file, cb) {
cb(null, Date.now().toString() + "-" + file.originalname);
}
},)
})
router.post('/', upload.array('files'), function(req, res, next) {
console.log('Successfully uploaded ' + req.files.length + ' files!');
});
Want to have sub-second latency as I do with direct AWS CLI upload or using multer to store to local disk, takes 10 seconds to minute or more on sub-MB files.
解决方案
获得洞察力的一种方法是在响应套接字上代理 write 函数,并检查它是如何被调用的:
var upload = multer({
storage: multerS3({
s3: s3,
bucket: bucketName,
acl: 'public-read',
contentType: multerS3.AUTO_CONTENT_TYPE,
metadata: function (req, file, cb) {
cb(null, {fieldName: file.fieldname});
},
key: function (req, file, cb) {
cb(null, Date.now().toString() + "-" + file.originalname);
}
},)
})
router.post('/'
(req, res, next) => { // debug middleware
const write = res.socket.write;
res.socket.write = (function(...args) {
// inspect args, look at the time between invocations of write
// also check the size of the chunks being passed to write
return write(...args)
}).bind(res.socket);
next();
}
, upload.array('files'), function(req, res, next) {
console.log('Successfully uploaded ' + req.files.length + ' files!');
});
推荐阅读
- webdriver - java.lang.AssertionError:地图与键不匹配:国家实际:Mgdtoemizqbpfrt 预期:
- java - 如何创建一个子类的对象,该对象扩展另一个类,该类位于另一个类中?
- html - 将两个 div(javascript 广告)并排放置
- php - 如何在 PHP 中从另一个页面插入数据
- autodesk-forge - 无法使用 NWC 文件中的 Autodesk.AEC.LevelsExtension 检索楼层数据
- php - 清理输入数据以避免脚本执行的最佳方法
- sitecore - Sitecore 根据条件取消发布
- ios - 如何在根级别使用活动指示器和 RadSideDrawer?
- reactjs - react useEffect fetch api data 给出错误 TypeError: Cannot read property 'cases' of undefined
- assembly - 汇编中添加“0”和子“0”的含义