Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 尽管使用缓冲区调用文件类型npm模块,但该模块返回null,我做错了什么?_Javascript_Node.js_Express_File Upload_Buffer - Fatal编程技术网

Javascript 尽管使用缓冲区调用文件类型npm模块,但该模块返回null,我做错了什么?

Javascript 尽管使用缓冲区调用文件类型npm模块,但该模块返回null,我做错了什么?,javascript,node.js,express,file-upload,buffer,Javascript,Node.js,Express,File Upload,Buffer,我正在开发一个网站,用户可以上传视频文件存储在MongoDB中。在上传和存储文件之前,我想检查并验证文件的mimetype。我想在npm模块的帮助下做到这一点,我尝试过使用文件类型,但没有成功 链接到文件类型npm模块: 我使用上传文件的缓冲区调用模块(使用mp4文件测试),但它返回null。以下是我的上传路线代码: 'use strict'; const router = require('express').Router(); const VideoInfo = require('../.

我正在开发一个网站,用户可以上传视频文件存储在MongoDB中。在上传和存储文件之前,我想检查并验证文件的mimetype。我想在npm模块的帮助下做到这一点,我尝试过使用文件类型,但没有成功

链接到文件类型npm模块:

我使用上传文件的缓冲区调用模块(使用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;

我做错了什么?

问题是我没有得到视频文件缓冲区

解决这个问题的方法是在我的应用程序中加入了巴士男孩身体解析器:

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

app.use(busboyBodyParser({
  limit: '120mb'
}))
然后我可以从请求中获取缓冲区:

const fileContent = req.files.video
const buffer = fileContent.data
然后我可以通过使用缓冲区调用file type来获取文件的文件类型