Node.js Filesystem in JavaScript

Introduction

Node’s fs (filesystem) and path modules read and write files, list directories, and build cross-platform paths. Server apps use them for logs, uploads, config files, and static assets. This chapter uses promise-based APIs (fs/promises) recommended for modern async code.

Prerequisites

path — Join Paths Safely

javascript
// path.mjs
import path from "node:path";
import { fileURLToPath } from "node:url";
 
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
 
const dataFile = path.join(__dirname, "data", "app.json");
console.log(dataFile);

Use path.join instead of string concatenation with / or \.

Read Text File

javascript
// read.mjs
import fs from "node:fs/promises";
 
async function readConfig(filePath) {
  const text = await fs.readFile(filePath, "utf8");
  return JSON.parse(text);
}
 
const config = await readConfig("./config.json").catch((err) => {
  console.error("read failed:", err.message);
  return { port: 3000 };
});
 
console.log(config);

Write Text File

javascript
// write.mjs
import fs from "node:fs/promises";
 
const payload = { savedAt: new Date().toISOString(), ok: true };
await fs.writeFile("./out/result.json", JSON.stringify(payload, null, 2));
console.log("written");

Create parent folders first if missing:

javascript
await fs.mkdir("./out", { recursive: true });

List Directory

javascript
// list.mjs
import fs from "node:fs/promises";
 
const entries = await fs.readdir(".", { withFileTypes: true });
for (const entry of entries) {
  console.log(entry.isDirectory() ? "[dir]" : "[file]", entry.name);
}

Check Existence

javascript
import fs from "node:fs/promises";
 
try {
  await fs.access("./config.json");
  console.log("exists");
} catch {
  console.log("missing");
}

Mini Example: Append Log Line

javascript
// log-append.mjs
import fs from "node:fs/promises";
import path from "node:path";
 
const logPath = path.join("logs", "app.log");
await fs.mkdir(path.dirname(logPath), { recursive: true });
 
const line = `${new Date().toISOString()} server started\n`;
await fs.appendFile(logPath, line, "utf8");
console.log("logged to", logPath);

FAQ

Sync readFileSync?

Exists for scripts—blocks the event loop; prefer async in servers.

Watch files?

fs.watch fires change events—use mature libraries for production file watching.

Permissions errors?

Handle EACCES / ENOENT in catch blocks; validate paths from user input.

What comes next?

Node HTTP server.