Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Как проверить, существует ли файл в Node.js

Короткий ответ

existsSync() из node:fs возвращает true или false:

import { existsSync, writeFileSync } from 'node:fs';
 
writeFileSync('config.json', '{}');
 
console.log(existsSync('config.json'));
console.log(existsSync('missing.json'));

Результат:

true
false

С промисами

В асинхронном коде access() выбрасывает ошибку, если файла нет:

import { access, writeFile } from 'node:fs/promises';
 
const exists = async (path) => {
  try {
    await access(path);
    return true;
  } catch {
    return false;
  }
};
 
await writeFile('data.txt', '');
console.log(await exists('data.txt'), await exists('nope.txt'));

Результат:

true false

Файл или папка

stat() сообщает, на что указывает путь:

import { mkdir, stat, writeFile } from 'node:fs/promises';
 
await mkdir('uploads', { recursive: true });
await writeFile('uploads/photo.jpg', 'abc');
 
console.log((await stat('uploads')).isDirectory());
console.log((await stat('uploads/photo.jpg')).isFile());

Результат:

true
true

Частая ошибка

Сначала проверить, потом прочитать — между этими шагами файл может исчезнуть. Если файл всё равно нужно прочитать, просто читайте его и обрабатывайте ошибку ENOENT:

import { readFile } from 'node:fs/promises';
 
const text = await readFile('settings.txt', 'utf8').catch((error) => {
  if (error.code === 'ENOENT') return 'default settings';
  throw error;
});
 
console.log(text);

Результат:

default settings

Функции из этого ответа

  • try...catch — Перехватывает ошибки, чтобы программа не остановилась.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.