Node.js Cheatsheet

HTTP Server

Use this Node.js reference while you build software engineering projects, review code for technical interview prep, or polish examples for a software engineer resume.

Creating an HTTP Server

import http from "node:http";

const server = http.createServer((req, res) => {
  res.writeHead(200, { "Content-Type": "text/plain" });
  res.end("Hello, world!\n");
});

server.listen(3000, "0.0.0.0", () => {
  console.log("Listening on http://localhost:3000");
});

Request Object (IncomingMessage)

server.on("request", (req, res) => {
  req.method;          // "GET" | "POST" | "PUT" | "DELETE" ...
  req.url;             // "/path?a=1&b=2"  (raw, not parsed)
  req.headers;         // { host, "content-type", authorization, ... }
  req.headers["content-type"];
  req.httpVersion;     // "1.1"
  req.socket.remoteAddress;  // client IP

  // Parse URL
  const url = new URL(req.url, `http://${req.headers.host}`);
  url.pathname;        // "/path"
  url.searchParams.get("a");  // "1"
});

Response Object (ServerResponse)

// Status + headers (before any write)
res.statusCode = 200;
res.setHeader("Content-Type", "application/json");
res.setHeader("X-Custom", "value");
res.removeHeader("X-Powered-By");
res.getHeader("content-type");

// Combined (replaces any setHeader calls)
res.writeHead(201, {
  "Content-Type": "application/json",
  "Location": "/resource/1",
});

// Send body
res.write("chunk 1");   // partial body (can call many times)
res.write("chunk 2");
res.end();              // flush and close

res.end(JSON.stringify({ ok: true }));  // body + close in one call

// Check if headers already sent
res.headersSent;        // boolean

Reading the Request Body

// Raw chunks
async function readBody(req) {
  const chunks = [];
  for await (const chunk of req) {
    chunks.push(chunk);
  }
  return Buffer.concat(chunks).toString("utf8");
}

// JSON body
const body = JSON.parse(await readBody(req));

// With size limit
async function readBodyLimited(req, maxBytes = 1_000_000) {
  let size = 0;
  const chunks = [];
  for await (const chunk of req) {
    size += chunk.length;
    if (size > maxBytes) throw new Error("Payload too large");
    chunks.push(chunk);
  }
  return Buffer.concat(chunks).toString("utf8");
}

Routing by Hand

import http from "node:http";
import { URL } from "node:url";

const server = http.createServer(async (req, res) => {
  const url    = new URL(req.url, `http://${req.headers.host}`);
  const method = req.method;
  const path   = url.pathname;

  if (method === "GET"  && path === "/")          return handleHome(req, res);
  if (method === "GET"  && path === "/health")    return handleHealth(req, res);
  if (method === "POST" && path === "/echo")      return handleEcho(req, res);
  if (method === "GET"  && path.startsWith("/users/")) {
    const id = path.slice("/users/".length);
    return handleUser(req, res, id);
  }

  res.writeHead(404, { "Content-Type": "application/json" });
  res.end(JSON.stringify({ error: "Not found" }));
});

HTTPS Server

import https from "node:https";
import fs    from "node:fs";

const server = https.createServer({
  key:  fs.readFileSync("key.pem"),
  cert: fs.readFileSync("cert.pem"),
  // ca: fs.readFileSync("chain.pem"),  // optional CA bundle
}, (req, res) => {
  res.end("Secure!");
});

server.listen(443);

Making HTTP Requests (http.request / https.request)

import https from "node:https";

// Low-level
const req = https.request(
  "https://api.example.com/data",
  { method: "POST", headers: { "Content-Type": "application/json" } },
  (res) => {
    let body = "";
    res.setEncoding("utf8");
    res.on("data", chunk => body += chunk);
    res.on("end", () => console.log(JSON.parse(body)));
  }
);
req.on("error", console.error);
req.write(JSON.stringify({ hello: "world" }));
req.end();

For real projects use the built-in fetch (Node 18+) or a library.

fetch (Node 18+)

// GET
const res  = await fetch("https://api.example.com/items");
const data = await res.json();

// POST JSON
const res = await fetch("https://api.example.com/items", {
  method:  "POST",
  headers: { "Content-Type": "application/json", "Authorization": `Bearer ${token}` },
  body:    JSON.stringify({ name: "foo" }),
});
if (!res.ok) throw new Error(`HTTP ${res.status}`);
const item = await res.json();

// Other response types
await res.text();         // string
await res.arrayBuffer();  // ArrayBuffer
await res.blob();         // Blob

// With timeout (AbortController)
const ac  = new AbortController();
const tid = setTimeout(() => ac.abort(), 5000);
const res = await fetch(url, { signal: ac.signal });
clearTimeout(tid);

// Inspect headers
res.headers.get("content-type");
res.status;       // 200
res.statusText;   // "OK"
res.url;          // final URL after redirects

Server Events

server.on("request", (req, res) => { ... });      // alias for callback
server.on("connection", (socket) => { ... });     // new TCP connection
server.on("close", () => console.log("closed"));  // server closed
server.on("error",  (err) => console.error(err)); // bind error etc.

// Graceful shutdown
process.on("SIGTERM", () => {
  server.close(() => {
    console.log("Server shut down");
    process.exit(0);
  });
});

Server Options

const server = http.createServer({
  keepAlive:          true,  // enable TCP keepalive
  keepAliveInitialDelay: 0,  // ms before first keepalive probe
  connectionsCheckingInterval: 30_000,
  requestTimeout:     300_000,  // ms to receive full request (Node 14.11+)
  headersTimeout:     60_000,   // ms to receive request headers
  maxHeaderSize:      16_384,   // bytes
});

server.timeout       = 120_000;   // ms — socket inactivity timeout
server.keepAliveTimeout = 5_000;  // ms — keep-alive idle timeout
server.maxHeadersCount = 2000;

HTTP/2 (h2)

import http2 from "node:http2";
import fs    from "node:fs";

const server = http2.createSecureServer({
  key:  fs.readFileSync("key.pem"),
  cert: fs.readFileSync("cert.pem"),
});

server.on("stream", (stream, headers) => {
  stream.respond({ ":status": 200, "content-type": "text/plain" });
  stream.end("Hello HTTP/2");
});

server.listen(443);