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.