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

10 1 1 1 1

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.

Tiugo image

Modular, Fast, and Built for Developers

CKEditor 5 gives you full control over your editing experience. A modular architecture means you get high performance, fewer re-renders and a setup that scales with your needs.

Start now

Top comments (0)

Sentry image

Make it make sense

Make sense of fixing your code with straight-forward application monitoring.

Start debugging β†’

πŸ‘‹ Kindness is contagious

Engage with a wealth of insights in this thoughtful article, valued within the supportive DEV Community. Coders of every background are welcome to join in and add to our collective wisdom.

A sincere "thank you" often brightens someone’s day. Share your gratitude in the comments below!

On DEV, the act of sharing knowledge eases our journey and fortifies our community ties. Found value in this? A quick thank you to the author can make a significant impact.

Okay