w3resource

Building HTTP Servers with Node.js


Creating an HTTP Server in Node.js

The http module in Node.js enables developers to create and manage HTTP servers and clients. With this module, you can handle HTTP requests and responses, making it a fundamental tool for building web servers and APIs.

This guide provides an in-depth explanation of creating an HTTP server, handling routes, and responding to requests using Node.js. It also includes examples and best practices for building scalable HTTP-based applications.


Syntax:

To use the http module:

    1. Import the module using require('http').

    2. Use http.createServer to create a server instance.

    3. Use the listen method to bind the server to a specific port.


Examples and Code

1. Basic HTTP Server Example

Code:

// Import the http module
const http = require('http');

// Create an HTTP server
const server = http.createServer((req, res) => {
    // Set the response header
    res.writeHead(200, { 'Content-Type': 'text/plain' });

    // Send a response message
    res.end('Hello, World!');
});

// Start the server on port 3000
server.listen(3000, () => {
    console.log('Server is running at http://localhost:3000');
});

Explanation:

  • http.createServer: Creates a new HTTP server instance.
  • req: Represents the incoming HTTP request.
  • res: Represents the server's HTTP response.
  • res.writeHead: Sets the HTTP status code and headers.
  • res.end: Ends the response and sends data to the client.
  • server.listen: Starts the server and binds it to port 3000.

2. Handling Different Routes

Code:

// Import the http module
const http = require('http');

// Create an HTTP server
const server = http.createServer((req, res) => {
    // Handle routes based on the request URL
    if (req.url === '/') {
        res.writeHead(200, { 'Content-Type': 'text/plain' });
        res.end('Welcome to the Home Page!');
    } else if (req.url === '/about') {
        res.writeHead(200, { 'Content-Type': 'text/plain' });
        res.end('About Us Page');
    } else {
        res.writeHead(404, { 'Content-Type': 'text/plain' });
        res.end('404 Not Found');
    }
});

// Start the server on port 3000
server.listen(3000, () => {
    console.log('Server is running at http://localhost:3000');
});

Explanation:

  • req.url: Determines the route of the incoming request.
  • Routes such as /, /about, and others are handled with conditional statements.
  • A 404 response is sent for undefined routes.

3. Serving JSON Data

Code:

// Import the http module
const http = require('http');

// Create an HTTP server
const server = http.createServer((req, res) => {
    // Check the request URL
    if (req.url === '/api') {
        const data = {
            message: 'Hello, this is JSON data!',
            status: 'success',
        };

        // Respond with JSON data
        res.writeHead(200, { 'Content-Type': 'application/json' });
        res.end(JSON.stringify(data));
    } else {
        res.writeHead(404, { 'Content-Type': 'text/plain' });
        res.end('Route Not Found');
    }
});

// Start the server on port 3000
server.listen(3000, () => {
    console.log('Server is running at http://localhost:3000');
});

Explanation:

  • Content-Type: application/json: Sets the response type as JSON.
  • JSON.stringify(data): Converts the JavaScript object into a JSON string before sending it in the response.

Advanced HTTP Features

1. Query Parameters Handling

Code:

// Import the required modules
const http = require('http');
const url = require('url');

// Create an HTTP server
const server = http.createServer((req, res) => {
    const queryObject = url.parse(req.url, true).query;

    res.writeHead(200, { 'Content-Type': 'application/json' });
    res.end(JSON.stringify(queryObject));
});

// Start the server on port 3000
server.listen(3000, () => {
    console.log('Server is running at http://localhost:3000');
});

Explanation:

  • url.parse: Parses the request URL to extract query parameters.
  • Query parameters are included in the response as JSON.

2. Streaming Data

Code:

// Import the http and fs modules
const http = require('http');
const fs = require('fs');

// Create an HTTP server
const server = http.createServer((req, res) => {
    const stream = fs.createReadStream('./largefile.txt');
    stream.pipe(res);
});

// Start the server on port 3000
server.listen(3000, () => {
    console.log('Server is running at http://localhost:3000');
});

Explanation:

  • fs.createReadStream: Streams the content of a large file to the response.
  • stream.pipe(res): Pipes the stream data directly to the response object.

Best Practices for HTTP Servers

    1. Use Middleware for Complex Applications: For routing, authentication, and error handling, consider using frameworks like Express.js.

    2. Proper Error Handling: Ensure you handle errors gracefully with try-catch blocks and proper HTTP status codes.

    3. Security:

    • Sanitize input to prevent injection attacks.
    • Use HTTPS for secure communication.

    4. Optimize Performance:Use tools like Node.js clustering or load balancing to handle high traffic.


Common HTTP Methods Supported by Node.js

Method Purpose
GET Retrieve data from the server.
POST Submit data to be processed on the server.
PUT Update existing data on the server.
DELETE Remove data from the server.

Practical Guides to Node.js Snippets and Examples.



Follow us on Facebook and Twitter for latest update.