DEV Community

Cover image for How to build real-time data applications using Mongoose and WebSockets in Node.js
Akash Bais
Akash Bais

Posted on

How to build real-time data applications using Mongoose and WebSockets in Node.js

Creating real-time data applications involves integrating technologies that allow for seamless, instantaneous communication between a server and clients. In this article, we'll explore how to achieve real-time functionality using Mongoose, a MongoDB object modeling tool for Node.js, and WebSockets, a communication protocol that enables real-time data exchange between clients and servers.

Prerequisites

Before proceeding, ensure you have the following installed:

  1. Node.js: Install Node.js
  2. MongoDB: Install MongoDB
  3. Mongoose: npm install mongoose
  4. Express: npm install express
  5. Socket.IO: npm install socket.io

Setting Up the Project

Create a new directory for your project and navigate to it in your terminal:

mkdir real-time-app
cd real-time-app
Enter fullscreen mode Exit fullscreen mode

Initialize a new Node.js project:

npm init -y
Enter fullscreen mode Exit fullscreen mode

Install the necessary dependencies:

npm install express mongoose socket.io
Enter fullscreen mode Exit fullscreen mode

Setting Up the Server

Create a file named server.js and import the required modules:

const express = require('express');
const http = require('http');
const mongoose = require('mongoose');
const socketio = require('socket.io');

const app = express();
const server = http.createServer(app);
const io = socketio(server);

const PORT = process.env.PORT || 3000;

// MongoDB connection
mongoose.connect('mongodb://localhost/realtimeapp', { useNewUrlParser: true, useUnifiedTopology: true });
mongoose.connection.once('open', () => {
  console.log('Connected to MongoDB');
});

server.listen(PORT, () => {
  console.log(`Server running on port ${PORT}`);
});
Enter fullscreen mode Exit fullscreen mode

Creating a Mongoose Schema

Let's define a Mongoose schema for our data. In this example, we'll create a simple schema for messages:

const mongoose = require('mongoose');

const messageSchema = new mongoose.Schema({
  text: String,
  user: String,
});

const Message = mongoose.model('Message', messageSchema);

module.exports = Message;
Enter fullscreen mode Exit fullscreen mode

Implementing WebSocket Communication

We'll set up Socket.IO to handle WebSocket communication between the server and clients. Modify the server.js file to include WebSocket handling:

const express = require('express');
const http = require('http');
const mongoose = require('mongoose');
const socketio = require('socket.io');
const Message = require('./models/message'); // Import the Mongoose model

const app = express();
const server = http.createServer(app);
const io = socketio(server);

const PORT = process.env.PORT || 3000;

mongoose.connect('mongodb://localhost/realtimeapp', { useNewUrlParser: true, useUnifiedTopology: true });
mongoose.connection.once('open', () => {
  console.log('Connected to MongoDB');
});

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

  // Send existing messages to the connected client
  Message.find().then((messages) => {
    socket.emit('init', messages);
  });

  // Listen for new messages from the client
  socket.on('message', (msg) => {
    const message = new Message(msg);
    message.save().then(() => {
      io.emit('message', message); // Broadcast the message to all connected clients
    });
  });

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

server.listen(PORT, () => {
  console.log(`Server running on port ${PORT}`);
});
Enter fullscreen mode Exit fullscreen mode

Setting Up the Client

Create an index.html file and a client.js file in the project directory.

index.html

<!DOCTYPE html>
<html>
<head>
  <title>Real-Time Chat App</title>
</head>
<body>
  <ul id="messages"></ul>
  <input id="messageInput" autocomplete="off">
  <button onclick="sendMessage()">Send</button>

  <script src="/socket.io/socket.io.js"></script>
  <script src="client.js"></script>
</body>
</html>
Enter fullscreen mode Exit fullscreen mode

client.js

const socket = io();

function appendMessage(message) {
  const ul = document.getElementById('messages');
  const li = document.createElement('li');
  li.appendChild(document.createTextNode(`${message.user}: ${message.text}`));
  ul.appendChild(li);
}

socket.on('init', (messages) => {
  const ul = document.getElementById('messages');
  ul.innerHTML = ''; // Clear existing messages

  messages.forEach((message) => {
    appendMessage(message);
  });
});

socket.on('message', (message) => {
  appendMessage(message);
});

function sendMessage() {
  const text = document.getElementById('messageInput').value;
  const user = 'User'; // For simplicity, we'll use a fixed user name

  socket.emit('message', { text, user });

  document.getElementById('messageInput').value = ''; // Clear the input field after sending a message
}
Enter fullscreen mode Exit fullscreen mode

Running the Application

Start the server by running:

node server.js
Enter fullscreen mode Exit fullscreen mode

Open index.html in a web browser. You can open multiple tabs to simulate multiple clients. Type a message in one tab and see it instantly appear in the other tabs, demonstrating real-time communication using Mongoose and WebSockets.

This example demonstrates the basic setup for a real-time chat application using Mongoose for MongoDB integration and Socket.IO for real-time communication. Feel free to expand and customize this example based on your specific requirements.

Top comments (0)