1

can anyone help me figure out what changes I need to make to my code in order to change how I am saving new chatroom messages to the MongoDB database? I am currently creating entirely new documents on each message submission in the app. I would instead like to push each message content to the inner message array of each specific room's document.

This is the data model I have created for the real-time chatroom app.

room.model.js

const mongoose = require('mongoose');


const roomSchema = new mongoose.Schema({
    roomID: String,
    messages: [{
        username: String,
        text: String,
        time: {
            type: Date,
            default: Date.now
        }
    }]
});

const Room = mongoose.model("Room", roomSchema);

module.exports = Room;

And this is the main code from server.js. I would like to change the "Listen for chat message" area's logic.

server.js

require('dotenv').config();
const path = require('path');
const http = require('http');
const express = require('express');
const socketio = require('socket.io');
const mongoose = require('mongoose');
const formatMessage = require('./utils/messages');
const {
    userJoin,
    getCurrentUser,
    userLeave,
    getRoomUsers
} = require('./utils/users');
const Room = require("./backend/models/room.model");

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


// Set static folder
app.use(express.static(path.join(__dirname, 'public')));

const botName = 'Chatter Bot';


//Database connection
const uri = process.env.ATLAS_URI;

mongoose.connect(uri, {
    useNewUrlParser: true,
    useUnifiedTopology: true,
    useCreateIndex: true
});

const connection = mongoose.connection;
connection.once('open', () => {
    console.log("MongoDB database connection established successfully");
})

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


// Run when client connects
io.on('connection', socket => {
    socket.on('joinRoom', ({
        username,
        room
    }) => {
        const user = userJoin(socket.id, username, room);

        socket.join(user.room);



        // Welcome current user
        socket.emit('message', formatMessage(botName, 'Welcome to Chatter!'));

        //Load saved messages for specific room, if messages exist in database
        Room.find({roomID: user.room}, function (err, foundItems) {
            if (foundItems) {
                //foundItems.forEach(foundItems => {
                    socket.emit('load old messages', foundItems);
                    console.log(foundItems);
                //});
            } else {
                console.log(err);
            }

        });





        // Broadcast when a user connects
        socket.broadcast.to(user.room).emit('message', formatMessage(botName, `${user.username} has joined the chat`));

        // Send users and room info
        io.to(user.room).emit('roomUsers', {
            room: user.room,
            users: getRoomUsers(user.room)
        });

    });

    // Listen for chatMessage
    socket.on('chatMessage', msg => {
        const user = getCurrentUser(socket.id);

        io.to(user.room).emit('message', formatMessage(user.username, msg));

        //Save messages for room to database
        const newMsg = new Room({
            roomID: user.room,
            messages: [{
                username: user.username,
                text: msg
            }]
        });


        newMsg.save((err, result) => {
            if (err) {
                console.log(err);
            } else {
                console.log("Message for room " + user.room + " saved to DB");
                console.log(result);



            }
        });
    });



    // Runs when client disconnects
    socket.on('disconnect', () => {
        const user = userLeave(socket.id);

        if (user) {
            io.to(user.room).emit(
                'message',
                formatMessage(botName, `${user.username} has left the chat`)
            );

            // Send users and room info
            io.to(user.room).emit('roomUsers', {
                room: user.room,
                users: getRoomUsers(user.room)
            });
        }

    });
});


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

server.listen(PORT, () => console.log(`Server running on port ${PORT}`));
DrSnipesMcGee21
  • 175
  • 1
  • 10

0 Answers0