Выбор ответа Middle Файлы и процессы обновлено

existsSync перед открытием

Вопрос

Чем плох такой код в сервере?

if (fs.existsSync(file)) {
  const data = await fs.promises.readFile(file);
  send(data);
}

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Гонка: файл удалят между проверкой и чтением, ошибка не поймана. Между проверкой и чтением проходит время, файл может исчезнуть (TOCTOU, time of check to time of use).

Варианты ответа

  1. existsSync не работает с промисами и вернёт промис вместо булева
  2. Гонка: файл удалят между проверкой и чтением, ошибка не пойманаправильный ответ
  3. readFile не умеет читать файлы, проверенные existsSync
  4. Ничем, это рекомендованный паттерн из документации Node

Разбор

Между проверкой и чтением проходит время, файл может исчезнуть (TOCTOU, time of check to time of use). Надёжнее сразу читать и поймать ошибку ENOENT в try/catch. Заодно уходит синхронный вызов из обработчика.

  • existsSync возвращает булево и с промисами совместим, просто проверка бесполезна.
  • Никакой связи между вызовами нет.
  • Документация Node как раз советует не проверять существование перед открытием.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.