Модуль npm файлового типа возвращает null, несмотря на вызов с буфером, что я делаю не так?

Я разрабатываю веб-сайт, на котором пользователи могут загружать видеофайлы для хранения в MongoDB. Прежде чем файлы будут загружены и сохранены, я хотел бы проверить и подтвердить mimetype файла. Я хотел бы сделать это с помощью модуля npm, я безуспешно пытался с файловым типом.

Ссылка на модуль npm файлового типа: https://www.npmjs.com/package/file-type

Я вызываю модуль с буфером загруженных файлов (проверено с mp4-файлами), но он возвращает null. Вот мой код для маршрута загрузки:

'use strict';

const router = require('express').Router();
const VideoInfo = require('../../models/VideoInfo');
const VideoAmount = require('../../models/VideoAmount');
const path = require('path');
const Lib = require('../../lib/Lib');
const multer = require('multer');
const GridFsStorage = require('multer-gridfs-storage');
const fileType = require('file-type');

// Defines storage of files with validation
const storage = new GridFsStorage({
  url: process.env.dbURL,
  file: (req, file) => {
    const data = [];

    req.on('data', chunk => {
      data.push(chunk);
    });

    req.on('end', () => {
      const buffer = Buffer.concat(data);
      const fType = fileType(buffer);

      return new Promise((resolve, reject) => {
        if (fType === null) {
          return reject(new Error('Unsupported file format'));
        }

        if (fType.mime !== 'video/mp4' ||
            fType.mime !== 'video/webm' ||
            fType.mime !== 'video/ogg') {
          return reject(new Error('Unsupported file format'));
        }

        if (!req.session.username) {
          return reject(new Error('Unauthorized file upload attempt'));
        }

        // changes the file name before storing
        const fileName =
          Lib.make.randomString() + path.extname(file.originalname);
        const fileInfo = {
          filename: fileName,
          bucketName: 'uploads'
        };
        resolve(fileInfo);
      });
    });
  }
});
const upload = multer({ storage });

router.route('/upload')

  .get((req, res) => {
    // renders upload form, not really relevant
  })

  .post(upload.single('video'), async (req, res) => {
    // file gets saved to DB with upload.single-function
  });

module.exports = router;

Что я делаю неправильно?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
0
367
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема заключалась в том, что я не получал буфер видеофайла.

Что решило это, так это включение busboy-body-parser в мое приложение:

const busboyBodyParser = require('busboy-body-parser')

app.use(busboyBodyParser({
  limit: '120mb'
}))

Тогда я мог получить буфер из запроса:

const fileContent = req.files.video
const buffer = fileContent.data

Затем я мог бы получить тип файла файла, вызвав file-type с буфером.

Другие вопросы по теме