NodeJS & Multer: прекратить загрузку файла в случае возникновения ошибки - PullRequest
0 голосов
/ 13 апреля 2019

привет, я создаю загрузку файлов с Node & Multer, это работает, но проблема в том, что если происходит ошибка (например, пользователь не заполнил другие поля), он все равно загружает файл, который мне не нужен

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

const storage = multer.diskStorage({

  destination: (req, file, callback) => {
    const userPath = path.join(imgStoragePath, req.userId);
    fs.mkdir(
      userPath,
      () => callback(null, userPath)
    )
  },

  filename: (req, file, callback) => {
    const filenameParts = file.originalname.split('.');
    const ext = filenameParts.pop();
    const basename = filenameParts.join('.');
    const additionalPath = Date.now() + '' + uuid() + '' +             
Math.floor(Math.random() * (2000 - 500)) + 500;
    callback(null, basename + '-' + additionalPath + '.' + ext);
  }

})

const upload = multer({
  storage,
  limits: '1mb'
})


   router.post('/', upload.single('image'), async (req, res) => {
  //code
})

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

Ответы [ 2 ]

0 голосов
/ 14 апреля 2019

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

  • у вас может быть html-проверка в интерфейсе, чтобы убедиться, что пользователь заполняет все поля required перед отправкой формы
  • вы можете сделать бэкэнд-проверку, чтобы убедиться, что все обязательные поля заполнены

Чтобы использовать 2-й шаг, вы можете использовать функцию, подобную этой

 export const setRequired = (...args: any): boolean => {
   let isValid = true;
   _.forEach(args, value => {
     if (isUndefined(value)) isValid = false;
   });
   return isValid;
 };
 const isValid: any = setRequired(file, first_name, last_name);

Функция использует машинопись и lodash и проверяет, что все указанные параметры существуют. Поэтому, прежде чем выполнять какие-либо операции в своем бэкэнде, передайте обязательные поля функции, которая будет возвращать логическое значение, чтобы уведомить вас, если все необходимые поля были получены от внешнего интерфейса.

Что касается 2-й части, относящейся к размеру файла и ошибкам типа файла для multer, вы можете попробовать что-то вроде этого

 const storage = multer.diskStorage({
 destination(req, file, cb) {
   cb(null, path.join(__dirname, `path_to_folder`));
 },
 filename(req, file, cb) {
   const ext = path.extname(file.originalname).toLowerCase();
   const file_name = uuidv4() + "_" + ext;
   cb(null, file_name);
 },
});

const upload = multer({
 storage,
 limits: { fileSize: 2000000 }, // In bytes: 2000000 bytes = 2 MB
 fileFilter(req, file, cb) {
   const ext = path.extname(file.originalname).toLowerCase();
   if (ext !== ".png" && ext !== ".jpg" && ext !== ".jpeg") {
     cb(new Error("Error: Unacceptable file format"), false);
   } else {
     cb(null, true);
   }
 },
}).any();
  router.post("/", (req, res) => {
    upload(req, res, async err => {
      if (err) {
        console.error(err);
        // An unknown error occurred when uploading.
        // the err object will contain the reason for the multer error
      } 

      if (req.files && req.files[0]) {
        // file has been saved 
         console.log(req.files[0].filename);
      }

    });
  },
);
0 голосов
/ 13 апреля 2019
 app.post('/upload',[
  multer({
    dest    : './uploads/',
    onError : function(err, next) {
      console.log('error', err);
      next(err);
    }
  }),
  function(req, res) {
    res.status(204).end();
  }
]);

// проверить эту ссылку из документации для нескольких пользователей https://github.com/expressjs/multer#error-handling

...