Не получаю размер файла при загрузке через Multer. Как его получить?

Загружаю файл через Multer на сервер Node JS. Когда хочу отфильтровать файл по весу через fileFilter, то объект file не содержит свойства size. Почему? По документации он должен быть, а его нет.

Логи из Middleware avatar дают сделующее:

console.log(req.file);
console.log(file);
undefined
{
  fieldname: 'avatar',
  originalname: 'football-157930_640.png',
  encoding: '7bit',
  mimetype: 'image/png'
}

А по документации должно быть больше полей: https://github.com/expressjs/multer/blob/master/doc/README-ru.md#%D0%B8%D0%BD%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%86%D0%B8%D1%8F-%D0%BE-%D1%84%D0%B0%D0%B9%D0%BB%D0%B0%D1%85

Клиентская часть кода:

btnSaveAvatar.addEventListener('click', () => {
  document.querySelector('#avatar_progress').classList.remove('hide');

  const formData = new FormData();
  formData.append('avatar', document.querySelector('#input_new_avatar').files[0]);

  fetch('/profile/new-avatar', {
    method: 'post',
    headers: {
      'CSRF-Token': tokenCSRF
    },
    body: formData
  })
  .then(res => res.json())
  .then(result => {
    if (result.status === 'error') {
      document.querySelector('#avatar_progress').classList.add('hide');
      alert(`Ошибка: ${result.description}`);
    }
    if (result.status === 'success') {
      document.querySelector('#avatar_progress').classList.add('hide');
      document.querySelector('#avatar_profile').src = result.avatarURL;
      document.querySelector('#avatar_sidenav').src = result.avatarURL;
      document.querySelector('#btn_delete_avatar').classList.remove('disabled');
    }
  })
  .catch(err => alert(`Ошибка: ${err}`));
}); 

Серверная часть кода:

const {Router} = require('express');
const redirectToIndexIfNotAuthenticated = require('../middleware/redirectToIndexIfNotAuthenticated');
const User = require('../models/user');
const router = Router();
const fs = require("fs");
const avatar = require('../middleware/avatar');

router.post('/new-avatar', redirectToIndexIfNotAuthenticated, async (req, res) => {
  try {
    let upload = avatar.single('avatar');

    upload(req, res, async (err) => {

      if (req.fileValidationError) {
        return res.json({
          status: 'error',
          description: req.fileValidationError
        });
      } else if (!req.file) {
        return res.json({
          status: 'error',
          description: 'Вы не выбрали аватар.'
        });
      } else if (err) {
        return res.json({
          status: 'error',
          description: err
        });
      }
  
      const user = await User.findById(req.user._id);

      if (user.avatarURL) {
        fs.unlink(user.avatarURL, async (err) => {
          if (err) {
            throw err;
          }
    
          user.avatarURL = req.file.path;
          await user.save();
    
          res.json({
            status: 'success',
            avatarURL: req.file.path
          });
        });
      } else {
        user.avatarURL = req.file.path;
        await user.save();
  
        res.json({
          status: 'success',
          avatarURL: req.file.path
        });
      }
    });
  } catch (err) {
    console.log(err);
  }
});

Middleware avatar:

const multer = require('multer');
const { v4: uuidv4 } = require('uuid');
const path = require('path');

const storage = multer.diskStorage({
  destination: function (req, file, cb) {
    cb(null, 'avatars');
  },
  filename: function (req, file, cb) {
    cb(null, `${uuidv4()}${path.extname(file.originalname)}`);
  }
});

const fileFilter = (req, file, cb) => {
  console.log(req.file);
  console.log(file);

  if (!['image/png', 'image/jpeg'].includes(file.mimetype)) {
    req.fileValidationError = 'Изображение должно быть в формате PNG, JPG или JPEG.';
    return cb(new Error('Изображение должно быть в формате PNG, JPG или JPEG.'), false);
  }

  if (file.size > 2097152) {
    req.fileValidationError = 'Изображение должно быть не более 2 МБ.';
    return cb(new Error('Изображение должно быть не более 2 МБ.'), false);
  }
  
  cb(null, true);
}

module.exports = multer({
  storage, fileFilter
});

Ответы (1 шт):

Автор решения: Voprositel

Размер файла в байтах хранится в req.file.size:

upload(req, res, async err => {
  console.log(req.file.size) // file size
});
→ Ссылка