Запустите Multer на Express сервере после установки флага - PullRequest
0 голосов
/ 04 августа 2020

Заранее благодарю всех за помощь. У меня есть сервер Express с конечной точкой, на которую я отправляю форму и файл. В форме есть флаг, который я должен проверить перед сохранением файла с помощью Multer, в основном что-то вроде

`if(!req.body.isProdMenu){
       // save file here
}`

Я хочу все же сохранить данные в отправленной форме, но не файл, если флаг ложный. Однако проблема в том, что Multer сохраняет файл, даже если флаг установлен в false. Вот моя конфигурация Multer:

const storage = multer.diskStorage({
      destination: (req, file, cb) => {
            cb(null, DIR);
      },
      filename: (req, file, cb) => {
            const fileName = file.originalname.toLowerCase().split(" ").join("-");
            cb(null, uuidv4() + "-" + fileName);
      }
});

const upload = multer({
      storage: storage,
      fileFilter: (req, file, cb) => {
            if (file.mimetype == "image/png" || file.mimetype == "image/jpg" || file.mimetype == "image/jpeg") {
                  cb(null, true);
            } else {
                  cb(null, false);
                  return cb(new Error("Allowed image formats: png, jpg, jpeg"));
            }
      }
}).single("posImg");

Вот и моя конечная точка:

const addProduct = async (req: express.Request, res: express.Response, next: express.NextFunction) => {
      MulterUpload(req, res, async (err: any) => {
            if (err instanceof multer.MulterError) {
                  console.log(err);
                  next(err);
            }
            
            if(!req.body.isProdMenu) {
               // Don't save file but proceed with saving the submitted form
            }             

            let file;
            file = req.file;
            const product: IProductData = parseBody(req.body);
            product.path = file.filename;

            let status = addProductService(product);
      });
}

Кроме того, когда я пытаюсь запросить тело вне промежуточного программного обеспечения MulterUpload, я получаю пустой объект, поэтому я не могу условно запустить промежуточное ПО. Может кто-нибудь мне помочь?

1 Ответ

0 голосов
/ 04 августа 2020

Я понял проблему, хотя все равно перехожу на Busybox. Вам нужно будет проверить тело в fileFilter. Я изменил свой fileFilter следующим образом:

fileFilter: (req, file, cb) => {
            let isAllowed = req.body.isProductMenu === "true";
            if (file.mimetype !== "image/png" && file.mimetype !== "image/jpg" && file.mimetype !== "image/jpeg") {
                  cb(null, false);
                  return cb(new Error("Allowed image formats: png, jpg, jpeg"));
            } else if (!isAllowed) {
                  cb(null, false);
                  return cb(new Error("Product without image"));
            } else {
                  cb(null, true);
            }
      }
...