загрузка multer-s3 внутри экспресса смехотворно медленная - PullRequest
0 голосов
/ 20 апреля 2019

Загрузка файлов на S3 через multer-s3 в моем экспресс-приложении смехотворно медленна (200 КБ занимает 10 секунд, время задержки зависит от размера файла). Проблема в multer-s3, но кто-то может сказать, как дальше отлаживать то, что происходит внутри библиотеки? Передача onFileUploadStart и т. Д. В multer больше не поддерживается. Я понятия не имею, как достичь пика внутри того, что делает multer-s3 и на каких стадиях возникает задержка.

Проблема не в AWS S3, поскольку загрузка из CLI выполняется очень быстро, и при этом загрузка не происходит, поскольку загрузка на локальный диск также быстрая. Любые прямые операции JavaScript S3 также работают так быстро, как и предполагалось.

Пробовал отключить функцию автоматического ввода контента мультитера, но это не помогло.

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.

1 Ответ

0 голосов
/ 20 апреля 2019

Один из способов получить представление - прокси записать функцию на сокете ответа и проверить, как она вызывается:

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!');
});
...