HTTP Servers in Node.js
Node.js has a built in http.Server
class. Here's how you can start an HTTP server
that responds to every request with the string 'Hello, World!':
const http = require('http');
// You usually don't call `new http.Server()`, the `http.createServer()`
// function creates a new `Server` instance for you.
const server = http.createServer((req, res) => res.end('Hello, World!'));
server instanceof http.Server; // true
await server.listen(3000);
Node.js' event loop based concurrency makes it easy to test HTTP servers. For example, you can start a server and then make an HTTP request to that server using the Axios HTTP library without any threads.
const http = require('http');
const server = http.createServer((req, res) => res.end('Hello, World!'));
server instanceof http.Server; // true
await server.listen(3000);
// Make an HTTP request to the server
const axios = require('axios');
const res = await axios.get('http://localhost:3000');
res.data; // 'Hello, World'
Versus Express
Most apps use an HTTP framework rather than using the http.Server
class directly.
The http.createServer()
function just takes a single function as a parameter, so,
if you use Node's HTTP server directly, you're responsible for implementing routing,
HTTP body parsing, etc. Frameworks like Express take care
of routing and body parsing, and provide patterns for organizing your code.
However, most frameworks use http.Server
under the hood, and let you access
the raw Node.js HTTP server. For example, Express' listen()
function returns
an instance of the http.Server
class:
const express = require('express');
const app = express();
const server = app.listen(3000);
server instanceof require('http').Server; // true