首页 > 解决方案 > Multer 未填充请求正文

问题描述

我的 Web 应用程序以包含 2 个文本字段和一个文件的多部分表单的形式发出发布请求。
我可以通过 req.file 完美地访问文件数据,但是请求正文始终未定义。
我发现一些帖子建议重新排列字段,以便文件是表单中的最后一条数据......这也没有解决问题!
从前端发出 post 请求

  uploadData(fileToUpload, xx, yy) {
    const URL = 'http://localhost:5000/api/files/';
    this.setState({ uploadingFile: true });
    let formData = new FormData();
    formData.append('testx', xx);
    formData.append('testy', yy);
    formData.append('file', fileToUpload);

    fetch(URL, {
      method: 'POST',
      body: formData,
    })

后端处理请求

const multer = require('multer');
const upload = multer({
  dest: 'labels/',
  fileFilter: function (req, file, cb) {
    if (file.mimetype !== 'application/pdf') {
      return cb(null, false, new Error('Incorrect file type'));
    }
    cb(null, true);
  },
  limits: { fileSize: 100000 },
}).single('file');
...
...
...
router.post('/', checkRequestType, upload, (req, res) => {
  upload(req, res, function (err) {
    if (err instanceof multer.MulterError) {
      console.log('We got a multer error boys');
      console.log(err);
      return res.send('Error with multer');
    } else if (err) {
      console.log('Error - not caused by multer... but during upload');
      return res.send('Unknown error during upload');
    }
    //Always null here?!?!
    console.log(req.body);
  });
});

标签: node.jsexpressmulter

解决方案


这里有几个问题。主要的是你打upload了两次电话。第一个作为中间件,然后您第二次手动调用它(以便您可以处理错误)。

你需要改变

router.post('/', checkRequestType, upload, (req, res) => {

对此

router.post('/', checkRequestType, (req, res) => {

这应该可以解决空体问题。

第二个问题是您在这一行中向 cb 传递了太多参数return cb(null, false, new Error('Incorrect file type'))。第一个参数应该是错误:return cb(new Error('Incorrect file type'))


推荐阅读