将新的聊天消息添加到“聊天室消息”数组中,而不是创建新文档

时间:2020-05-19 17:00:11

标签: node.js mongodb mongoose

有人可以帮助我弄清楚我需要对代码进行哪些更改,以更改将新的聊天室消息保存到MongoDB数据库的方式吗?我目前正在针对该应用程序中的每个消息提交创建全新的文档。相反,我想将每个邮件内容推送到每个特定会议室文档的内部邮件数组中。

这是我为实时聊天室应用创建的数据模型。

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;

这是server.js的主要代码。我想更改“听聊天消息”区域的逻辑。

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}`));

0 个答案:

没有答案