Building a Server

A Node.js HTTP server is a long-running program created with http.createServer that listens on a port and runs a handler function for every incoming request, sending back a response you control.

Learn Building a Server in our free Node.js course — a beginner-friendly interactive lesson with worked examples, a practice exercise and a quick reference.

Part of the free Node.js course at LearnCodingFast — hands-on lessons with examples you run in your browser, plus practice exercises and a quick quiz.

In the last lesson you met the http module. Now you'll use it to build a real server: one that starts up, listens on a port, reads what the client asked for, and sends back exactly the status, headers, and body you choose.

What You'll Learn in This Lesson

1️⃣ The Simplest Possible Server

A working Node server is only a few lines. You give http.createServer a handler function , then call server.listen(port) to start it. The handler receives two objects every time a request arrives: req (what the client asked for) and res (the reply you build). Read every comment below, then run it.

Save that as server.js and start it. Unlike a normal script, it doesn't exit — it stays running, waiting for requests, until you stop it with Ctrl+C .

2️⃣ Setting the Status Code and Headers

Every response carries a status code (200 means OK, 404 means not found) and headers (metadata about the body). You can set both in one shot with res.writeHead(status, headers) , which must run before res.end .

Or set them one at a time with res.statusCode and res.setHeader(key, value) . To send JSON , turn your object into a string with JSON.stringify and set Content-Type to application/json so the client knows how to read it.

3️⃣ Reading the Incoming Request

So far we've ignored what the client actually asked for. The req object tells you: req.method is the verb ( GET , POST , …) and req.url is the path. A request body (sent with a POST) doesn't arrive all at once — it streams in as chunks, so you collect it on the 'data' event and act on it when 'end' fires.

Your turn. The handler below is almost done — fill in the three blanks marked ___ so it replies with the JSON object {' '} . Follow the 👉 hints, then run it and compare with the expected output.

No blanks this time — just a brief and an outline. Using only req.url and if statements (no router yet — that's the next lesson), build a server that answers two paths and 404s everything else. Write it yourself, run it, and check your output against the example in the comments.

📋 Quick Reference — Node.js Servers

Practice quiz

Which built-in module creates an HTTP server in Node?

  • http
  • fs
  • net-server
  • express

Answer: http. The built-in http module's createServer builds a server with no install needed.

How many handler functions does http.createServer take?

  • One handler, called for every request
  • One per route
  • Two: request and response handlers
  • None

Answer: One handler, called for every request. createServer takes a single handler that Node calls for every incoming request.

What starts the server actually listening for requests?

  • server.start()
  • server.open()
  • server.listen(port)
  • server.run()

Answer: server.listen(port). Nothing happens until server.listen(port) begins listening on a port.

What does res.end() do?

  • Restarts the server
  • Logs the request
  • Opens a new connection
  • Sends the body and closes the response

Answer: Sends the body and closes the response. res.end() sends the body and finishes the response; without it the request hangs.

Which call sets the status code and headers together, before res.end?

  • res.writeHead(status, headers)
  • res.send(status)
  • res.header(status)
  • res.status(headers)

Answer: res.writeHead(status, headers). res.writeHead(statusCode, headersObject) sets both at once and must run before res.end.

To send a JS object as JSON, what must you call first?

  • JSON.parse(obj)
  • JSON.stringify(obj)
  • obj.toJSON only
  • res.json(obj)

Answer: JSON.stringify(obj). res.end sends strings, so JSON.stringify converts the object into a JSON string.

Which property tells you the HTTP verb of the request?

  • req.url
  • req.verb
  • req.method
  • req.path

Answer: req.method. req.method holds the verb such as GET or POST; req.url holds the path.

How does a POST request body arrive in the raw http handler?

  • All at once on req.body
  • As chunks via 'data' events, finalized on 'end'
  • As a query string
  • In req.params

Answer: As chunks via 'data' events, finalized on 'end'. The body streams in as chunks you collect on 'data', then act on when 'end' fires.

What does the error 'EADDRINUSE :::3000' mean?

  • The handler crashed
  • JSON failed to parse
  • Another program already holds port 3000
  • The body was too large

Answer: Another program already holds port 3000. EADDRINUSE means the port is already in use, often by an old copy of the server.

What header tells the client a response body is JSON?

  • Content-Type: application/json
  • Accept: text/plain
  • Content-Length
  • X-JSON: true

Answer: Content-Type: application/json. Setting Content-Type to application/json tells clients to parse the body as JSON.