Topics in this subject
JavaScript 1 min read Updated 4 Aug 2026

Part 22 — Node.js Basics

Core modules, HTTP server, Events (EventEmitter), Streams & buffers, process & timers

Node = V8 + libuv (async I/O) + core modules. Great for servers, tooling, CLIs.

Core modules#

import { readFile, writeFile } from "node:fs/promises";  // promise-based fs 🟢
import path from "node:path";
import http from "node:http";
import { EventEmitter } from "node:events";

const text = await readFile("data.txt", "utf8");
path.join("/a", "b", "c.txt");     // OS-correct path
path.extname("x.js");               // ".js"

HTTP server#

http.createServer((req, res) => {
  res.writeHead(200, { "Content-Type": "application/json" });
  res.end(JSON.stringify({ ok: true }));
}).listen(3000);

Events (EventEmitter)#

class Bus extends EventEmitter {}
const bus = new Bus();
bus.on("login", (user) => console.log(user, "logged in"));
bus.emit("login", "ada");

Streams & buffers#

Streams process data in chunks (don't load whole files into memory). Buffer holds raw bytes.

import { createReadStream, createWriteStream } from "node:fs";
createReadStream("big.csv")
  .pipe(transform)
  .pipe(createWriteStream("out.csv"));   // backpressure handled for you

process & timers#

process.argv;      // CLI args
process.env.NODE_ENV;
process.cwd();
process.on("SIGINT", () => { /* graceful shutdown */ process.exit(0); });
setImmediate(fn);  // runs after I/O callbacks (Node-only macrotask)
process.nextTick(fn); // runs before other microtasks (Node-specific)

⚠️ Node's event loop phases (timers → pending → poll → check → close) differ subtly from the browser; process.nextTick runs before the promise microtask queue.