How to build real-time data applications using Mongoose and WebSockets in Node.js
Akash Bais
Posted on October 5, 2023
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:
- Node.js: Install Node.js
- MongoDB: Install MongoDB
- Mongoose:
npm install mongoose
- Express:
npm install express
- 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
Initialize a new Node.js project:
npm init -y
Install the necessary dependencies:
npm install express mongoose socket.io
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}`);
});
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;
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}`);
});
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>
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
}
Running the Application
Start the server by running:
node server.js
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.
Posted on October 5, 2023
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.