Express -validator не проверяет req.body при работе с загрузкой изображений (multer) - PullRequest
0 голосов
/ 01 марта 2020

У меня есть форма, где у меня есть поля, такие как местоположение, возраст и изображение. Я отправляю эти три поля в форме data.

 location: 'Location 1',
 age: 23,
 image: (binary)

В бэкэнде я использую express и express -validator для проверки полей формы.

var imageUpload= multer({
  storage: multer.diskStorage({
      destination: (req, file, cb) => {
        cb(null, 'uploads/top-level')
      },
      filename: function (req, file, cb) {
        cb(null, file.originalname.split('.')[0] + '-' + Date.now() + path.extname(file.originalname))
      }
  }),
  fileFilter: (req, file, cb) => {
    if (file.mimetype == "image/png" || file.mimetype == "image/jpg" || file.mimetype == "image/jpeg") {
      cb(null, true);
    } else {
      return cb(new Error('Only .png, .jpg and .jpeg format allowed!'), false);
    }
  }
});

module.exports = { imageUpload};

I впервые попробовал с этим

router.post('/someroute', [isLoggedIn], create);

и вот create функция для фактической логики c

const create = async (req, res, next) => {
  fileUploadNow(req, res, async function(err) { // uploading file

    if (err) {
      return res.status(422).send(unExpectedError(
        'Only .png, .jpg and .jpeg format allowed!',
        'Only .png, .jpg and .jpeg format allowed!',
        'image'
      ))
    }


    check('location').isLength({ min: 3, max: 35}).withMessage('name must be at least 3 or maximum 35 characters long').trim().escape();
    check('age').isInt().withMessage('should be a number');

    const errors = await validationResult(req);

    if (!errors.isEmpty()) {
      return res.status(422).send({
        message: 'Got error while submitting',
        data: errors.array()
      });
    }

    if (!req.file) { 
      return res.status(422).send(unExpectedError(
        'Please select a thumbnail',
        'Please select a thumbnail',
        'image'
      ))
    }
    try {
      let image_path = config.SERVER_URL + '/' + req.file.filename;
      const {location, age} = req.body;

      let obj = {
        location: semester_name,
        slug: image_path,
        age: age
      }

      let result = await knex('table').insert(obj).returning('*');
      if (result) {

        return res.status(200).send({
          message: 'successfull',
          data: result
        })
      }
    } catch (err) {
      console.log(err)
      return res.status(422).send(unExpectedError(
        'Something went wrong, please try to add details again',
        'Something went wrong, please try to add semester details again',
        'semester'
      ))
    }
  })
}

С этим кодом я могу обработать ошибку для поля изображения и Я могу показать ошибки изображения пользователю , но не для данных, поступающих в req.body. может быть, нам нужно проверить часть проверки req.body только в промежуточном программном обеспечении маршрута.

Затем я попытался изменить следующим образом

router.post ('/ someroute', [isLoggedIn, imageUpload , Валидация], создать); // Я импортировал эти две функции

и Validation

const { check, validationResult } = require('express-validator');
const Validation= [
  check('location').isLength({ min: 3, max: 35}).withMessage('name must be at least 3 or maximum 35 characters long').trim().escape(),
    check('age').isInt().withMessage('should be a number')
];

module.exports = { Validation}

В показанной выше функции create я удалил функцию fileUploadNow и сохранил только часть logi c. Теперь в этом все работает, я получаю ошибку, которая генерируется req.body, а также я получаю ошибку изображения в консоли браузера (500 код состояния) , если выбран неправильный тип изображения, но я не удалось обработать ошибку изображения, что означает Я не могу показать ее пользователям . Как мне обрабатывать и показывать пользователю ошибки для изображения и части req.body

...