Ошибка NESTJS "ENOENT", нарушающая работу сервера API

У меня есть маршрут на моем сервере NESTJS Node API для получения файлов, однако, когда в пути нет файла, я получаю сообщение об ошибке:

Ошибка: ENOENT: нет такого файла или каталога, откройте «(указанный путь)»

После возникновения ошибки мой сервер перестает работать, и мне приходится снова перезапускать процесс с помощью «nest start».

Как мне поймать эту ошибку и вернуть ее в запрос, а не просто сломать API?

Код:

try {
  const file = createReadStream(join(process.cwd(), filesrc.path));

  res.set({
    "Content-Type": `${filesrc.type}`,
    "Content-Disposition": `attachment;filename = "${filesrc.original_name}"`,
    "Content-Length": +filesrc.size
  })
  res.status(200);
  return new StreamableFile(file);
} catch (err) {
  throw new HttpException('test', 500)
}

Примечание: «filesrc» — это переменная, содержащая некоторую информацию о файле.

Какая у вас @nestjs/common версия? Я мог бы поклясться, что исправил это, чтобы возвращать ошибку, но не крашить сервер.

Jay McDoniel 15.09.2022 22:44

@jay-mcdoniel В этом проекте используется версия "@nestjs/common": "^8.0.0"

Renan Fernandes 15.09.2022 22:51

В версии 9 есть исправление, которое предотвращает сбой сервера.

Jay McDoniel 15.09.2022 22:55

Это здорово, я постараюсь обновить версию и вернуться, если она исправлена ​​​​для меня, спасибо.

Renan Fernandes 15.09.2022 22:58
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
129
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Два решения, которые я нашел:

# 1 (рекомендуется), как предложил Джей Макдониэль, обновите NestJS до последней версии, версия 9 устраняет проблему.

# 2 (Если вы не можете обновить свои NestJ, мой случай), вы можете сначала проверить, существует ли файл, используя функцию Node fs «existSync»

 try {
  if (fs.existsSync(filesrc.path)) {
    const file = createReadStream(join(process.cwd(), filesrc.path));
    res.set({
      "Content-Type": `${filesrc.type}`,
      "Content-Disposition": `attachment;filename = "${filesrc.original_name}"`,
      "Content-Length": +filesrc.size
    })
    res.status(200);
    return new StreamableFile(file);
  }
  else {
    throw new HttpException('File not found', HttpStatus.NOT_FOUND)
  }
} catch (err) {
  if (err.message) {
    throw new HttpException(err.message, err.status)
  }
  throw new HttpException(err, 500)
}

с помощью этого «обходного пути» вы можете сами сгенерировать ошибку и предотвратить поломку сервера.

Другие вопросы по теме