Building a Real-Time Chat App with Node.js and Socket.io 🚀

Introduction

In this tutorial, we'll embark on an exciting journey to build a real-time chat application using Node.js and the socket.io library. Real-time applications have become increasingly popular, and building a chat app is a fantastic way to dive into the world of Node.js and enhance your skills while having some fun along the way.

Prerequisites

Make sure you have Node.js installed on your machine. If not, you can download it from nodejs.org.

Step 1. Initialize Your Project 🚀

Start by creating a new directory for your project and navigate into it using your terminal.

mkdir nodejs-chat-app
cd nodejs-chat-app

Now, initialize your project with npm:

npm init -y

Step 2. Install Dependencies

Now, let's get the tools we need. We're bringing in Express to build our server and socket.io for that real-time magic.

npm install express socket.io

Step 3. Set Up the Express Server

Create a file named server.js and set up a simple Express server.

// server.js
const express = require('express');
const app = express();
const server = require('http').createServer(app);
const io = require('socket.io')(server);

app.get('/', (req, res) => {
  res.sendFile(__dirname + '/index.html');
});

app.use(express.static(__dirname));

const PORT = 3000;
server.listen(PORT, () => {
  console.log(`Server is running on port ${PORT}`);
});

Step 4. Create the Chat UI

Time to make things look pretty! Craft a basic HTML file for our chat interface in index.html.

<!-- index.html -->
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Node.js Chat App</title>
    <!-- Add Bootstrap CSS -->
    <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet">
</head>

<body>
    <div class="container mt-5">
        <div id="chat" class="card">
            <div class="card-body">
                <ul id="messages" class="list-group">
                    <h2>Send Message</h2>
                </ul>
            </div>
            <form id="form" class="card-footer" action="">
                <div class="input-group">
                    <input id="message-input" class="form-control" autocomplete="off" />
                    <button class="btn btn-primary">Send</button>
                </div>
            </form>
        </div>
    </div>

    <!-- Add Bootstrap JS and Popper.js (required for Bootstrap) -->
    <script src="https://cdn.jsdelivr.net/npm/@popperjs/[email protected]/dist/umd/popper.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.min.js"></script>
    <script src="https://cdn.socket.io/4.0.1/socket.io.min.js"></script>
    <script src="/client.js"></script>
</body>

</html>

Run the Server

To launch the server, execute the command.

node server.js

Alternatively, you can use a package called nodemon automatic code detection. Install nodemon globally to make it accessible across all your projects.

npm install -g nodemon

Run the server using.

nodemon server.js

Open your browser and surf to http://localhost:3000 to witness the magic.

Chat App

Step 5. Handle Client-Side Logic

Create a client.js file to handle client-side logic. Add the following code.

// client.js
const socket = io();
const form = document.querySelector('#form');
const input = document.querySelector('#message-input');
const messages = document.querySelector('#messages');

form.addEventListener('submit', (e) => {
  e.preventDefault();
  if (input.value) {
    socket.emit('chat message', input.value);
    input.value = '';
  }
});

socket.on('chat message', (message) => {
  const li = document.createElement('li');
  li.textContent = message;
  messages.appendChild(li);
});

Step 6. Implement Real-time Communication

Back in your server.js file, sprinkle in some more magic to handle real-time chat.

// server.js
// ... (previous code)

io.on('connection', (socket) => {
  console.log('A user connected');

  socket.on('chat message', (message) => {
    io.emit('chat message', message);
  });

  socket.on('disconnect', () => {
    console.log('User disconnected');
  });
});

Step 7. Run Your Chat Application

In your terminal, utter this spell to unleash your chat application.

node server.js

Visit http://localhost:3000 in your browser, open multiple tabs, and witness the real-time magic unfold! 🎉💬

A Funny Chat Example with Alice and Bob

Imagine Alice and Bob having a quirky chat in real-time.

  • Alice: Hi, Bob! 🌈
  • Bob: Hey, Alice! How's it going? 🚀
  • Alice: Pretty good. Just testing our awesome chat app! 😎
  • Bob: Nice! I'm ready for some real-time magic. Abracadabra! 🎩✨

Watch as their messages instantly appear in each other's windows, creating a seamless and amusing chat experience. 🤣

Bob's window

Node JS

Local host

Alice window

Alice window

Conclusion

Bravo! 🎉 You've just conjured a real-time chat application using the magic of Node.js, Express, and socket.io. But wait, there's more! Dive deeper, add some sparkle to the UI, or share your creation with the world. Happy coding, magical developer! 🚀💻


Similar Articles