Как я могу перехватить ЛЮБУЮ ошибку из formidable.js в узле?

#node.js #error-handling #formidable

#node.js #обработка ошибок #грозный

Вопрос:

Я хочу перехватить ВСЕ ошибки, которые грозный может вызвать при загрузке файла. До сих пор мне не удалось выполнить самую основную: папка не существует. Обратите внимание, что эта ошибка генерируется только в целях тестирования путем добавления несуществующего пути к файлу, который нужно сохранить. Сам код отлично работает без сгенерированной ошибки.

Вот пример попытки перебора / рассылки спама, которую я пробовал:

 router.post('*', (req, res) => {
  try {
  // path is formed based on the type of file to be uploaded.
  // the file type is sent to different path. Ex.: logo: upload/logo
  const folder = path.join(__dirname, '../../public-NOT-EXISTING/media'   req.url);
  // check if folder exist, if not, create it
  // if (!fs.existsSync(folder)) {
  //   fs.mkdirSync(folder);
  //   console.log(util.yellow, 'Folder was created', util.Reset);
  // }
  // console.log(util.green,'Uploading to folder:', folder, util.Reset);

  const form = new formidable.IncomingForm();
  form.keepExtensions = true;
  form.uploadDir = folder;
  form.maxFieldsSize = 20 * 1024 * 1024;

  //Emitted whenever a new file is detected in the upload stream. Use this event if you want to stream the file to somewhere else while buffering the upload on the file system.
  /* this is where the renaming happens */
  form.on('fileBegin', function (name, file) {
    //rename the incoming file to the file's name
    file.path = form.uploadDir   file.name;
  });

  //Emitted whenever a field / file pair has been received. file is an instance of File.
  form.on('file', function(name, file) {
    console.log(util.magenta, 'Uploaded file name:', name, '(current name:', file.name,"')", util.Reset);
    res.status(200).send({message: 'File Uploaded'})
  });

  //Emitted when there is an error processing the incoming form. A request that experiences an error is automatically paused, you will have to manually call request.resume() if you want the request to continue firing 'data' events.
  form.on('error', function(err) {
    console.error('Something went wrong in uploading file:', err);
    res.status(500).send({message: err})
  });

  function errorHandle(err){
    console.error('Got the error in function cb', err);

  }
   form.parse(req, (errorHandle, fields, files) => {
      if (errorHandle)
        console.error('Got the error as CB argument', errorHandle);

      try{
      console.log('n parsing uploaded file -----------');
      console.log('Fields', fields);
      console.log('Received:', Object.keys(files));
      console.log();
      }catch (e) {
        console.error('Got the error in "parse" function', e)
      }
    });
  }catch (e) {
    console.error('Got the error in general try/cath', e)
  }
});
  

Однако ошибка не улавливается, и сервер отключается:

 Error: ENOENT: no such file or directory, open 'D:.... my path...'
Emitted 'error' event at:
    at fs.open (internal/fs/streams.js:279:12)
    at FSReqCallback.args [as oncomplete] (fs.js:145:20)
[nodemon] app crashed - waiting for file changes before starting...
  

Ответ №1:

Попробуйте это:

 process.on('uncaughtException', function(err) {
    // you can get all uncaught exception here. 
    console.log(err)
})
  

Комментарии:

1. Это работает! Это своего рода перехват методом «грубой силы», верно? Я не понимаю, почему formidable.js native on (‘ошибка …) не работает. Путь не найден — это самая основная ошибка.

2. Это что-то вроде глобального метода перехвата исключений, если ваш метод не способен обработать исключение.

3. Пожалуйста, отметьте как правильную, если это решает вашу проблему. Это также поможет другим.

4. у меня это тоже сработало, но сначала после удаления form.on (‘ошибка’, функция (ошибка) {

Ответ №2:

 // Error Handlers
process.on('unhandledRejection', async err => {
  console.error('Unhandled rejection', JSON.stringify(err));
});

process.on('uncaughtException', async err => {
  console.error('Uncaught exception', JSON.stringify(err));
});
  

Комментарии:

1. Пожалуйста, опишите, что вы изменили и почему, чтобы помочь другим определить проблему и понять этот ответ