Multer не заполняет тело запроса - PullRequest
1 голос
/ 14 апреля 2020

Мое веб-приложение отправляет запрос в форме многочастной формы с двумя текстовыми полями и одним файлом.
Я могу получить прекрасный доступ к данным файла через req.file, однако тело запроса всегда не определено.
Я нашел несколько постов, предлагающих переупорядочить поля так, чтобы файл был последним фрагментом данных в форме ... это тоже не решило проблему!
Выполнение почтового запроса из внешнего интерфейса

  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,
    })

Back End обработка запроса

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);
  });
});

1 Ответ

1 голос
/ 14 апреля 2020

Здесь есть несколько проблем. Главное, что вы звоните 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'))

...