Выбор ответа Middle Файлы и процессы обновлено
existsSync перед открытием
Вопрос
Чем плох такой код в сервере?
if (fs.existsSync(file)) {
const data = await fs.promises.readFile(file);
send(data);
}
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Гонка: файл удалят между проверкой и чтением, ошибка не поймана. Между проверкой и чтением проходит время, файл может исчезнуть (TOCTOU, time of check to time of use).
Варианты ответа
- existsSync не работает с промисами и вернёт промис вместо булева
- Гонка: файл удалят между проверкой и чтением, ошибка не пойманаправильный ответ
- readFile не умеет читать файлы, проверенные existsSync
- Ничем, это рекомендованный паттерн из документации Node
Разбор
Между проверкой и чтением проходит время, файл может исчезнуть (TOCTOU, time of check to time of use). Надёжнее сразу читать и поймать ошибку ENOENT в try/catch. Заодно уходит синхронный вызов из обработчика.
existsSyncвозвращает булево и с промисами совместим, просто проверка бесполезна.- Никакой связи между вызовами нет.
- Документация Node как раз советует не проверять существование перед открытием.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.