Multer 不填充请求正文

Multer not populating request body

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

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

你需要改变

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

至此

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

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

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