Как предотвратить загрузку файлов Multer при сбое проверки ввода - PullRequest
0 голосов
/ 01 мая 2019

Я создаю (POST) маршрут для обработки загрузки файлов, а также сохраняю некоторые другие свойства в MongoDB в дополнение к пути к файлу. Проблема заключается в том, что при сбое проверки ввода файл все еще загружается в статическую папку (загрузки).

Я использую промежуточное программное обеспечение Multer для загрузки файлов.

Настройка

const storage = multer.diskStorage({
  destination: (req, file, cb) => {
    cb(null, "./uploads/");
  },
  filename: (req, file, cb) => {
    cb(null, Date.now() + "-" + file.originalname);
  }
});

const fileFilter = (req, file, cb) => {
  if (file.mimetype === "image/jpeg" || file.mimetype === "image/png") {
    cb(null, true);
  } else {
    //rejects storing a file
    cb(null, false);
  }
};

const upload = multer({
  storage: storage,
  limits: {
    fileSize: 1024 * 1024 * 5
  },
  fileFilter: fileFilter
});

Поля

const seamUpload = upload.fields([
  { name: "stylePicture", maxCount: 1 },
  { name: "materialPicture", maxCount: 1 }
]);

Маршрут

router.post("/", [auth, seamUpload], async (req, res) => {
  const { error } = validateSeam(req.body);
  if (error) return res.status(400).send(error.details[0].message);

  const seam = new Seam({
    stylePicture: req.files["stylePicture"][0].path,
    materialPicture: req.files["materialPicture"][0].path,
    description: req.body.description,
    deliveryDate: req.body.deliveryDate,
    customer: req.body.customerId
  });

  await seam.save();

  res.send(seam);
});

Снимок экрана клиента (PostMan)

1 Ответ

0 голосов
/ 01 мая 2019

У вас может быть промежуточное программное обеспечение проверки ДО промежуточного программного обеспечения multer.Таким образом, когда проверка завершится неудачно, все последующие промежуточные программы не будут выполнены - и, следовательно, файлы не будут загружены.

Отделите проверку следующим образом:

const validateSeamUpload = (req, res, next) => {
    const { error } = validateSeam(req.body);
    if (error) return res.status(400).send(error.details[0].message);
    return next();
};

А затем смонтируйте validateSeamUpload ДО промежуточного программного обеспечения seamUpload следующим образом:

router.post("/", [auth, validateSeamUpload, seamUpload], async (req, res) => {
    /** No need for validation here as it was already done in validateSeamUpload */
    const seam = new Seam({
        stylePicture: req.files["stylePicture"][0].path,
        materialPicture: req.files["materialPicture"][0].path,
        description: req.body.description,
        deliveryDate: req.body.deliveryDate,
        customer: req.body.customerId
    });

    await seam.save();

    res.send(seam);
});

Кстати, вы также можете передать их в качестве аргументов post().Вот так:

router.post("/", /** => See, no need for an array */ auth, validateSeamUpload, seamUpload, async (req, res) => {
    /** your controller code */
});
...