【问题标题】:Chat server using Nodejs & Socket.io : Best way to log conversations [closed]使用 Nodejs 和 Socket.io 的聊天服务器:记录对话的最佳方式 [关闭]
【发布时间】:2015-04-14 14:35:39
【问题描述】:

我正在使用带有多个房间的聊天服务器,使用 nodejs 和 socket.io。我想知道保存所有对话的最佳方法是什么?

我也在使用 Mysql 和 Redis(会话)。我不确定 MySQL 是不是一个不错的选择,因为它会超载,我需要它来显示其他页面内容。 平面文件呢?这可能很棒,但是在尝试保存新消息时文件已经打开是否存在风险?

谢谢

【问题讨论】:

    标签: node.js socket.io


    【解决方案1】:

    我使用 Socket.IO、Node.js 和 MongoDB 开发了一个名为 montreus-chat 的聊天工具。 完整的源代码可以在this GitHub repo找到。

    以下是可能有用的部分来源:

    db.js:

    var MessageSchema = new Schema({
        message: String,
        room: String,
        sent: Date
    });
    var Message = mongoose.model('Message', MessageSchema);
    
    var findMessages = function(room) {
        return new Promise(function (resolve, decline){
            Message.find({room: room}).sort({sent: 'ascending'}).exec(function(error, messages) {
                if(!error){
                    resolve(messages);
                }else{
                    console.error(error.message);
                    decline(error);
                }
            });
        });
    }
    
    var addNewMessage = function(message, room){
        return new Promise(function (resolve, decline){
            var newMessage = new Message({
                message: message,
                room: room,
                sent: new Date()
            });
            newMessage.save(function(error){
                if(!error){
                    resolve();
                }else{
                    console.error(error);
                    decline(error);
                }
            });
        });
    }
    
    //Exporting methods
    exports.find = findMessages;
    exports.add = addNewMessage;
    

    app.js:

    roomRouter.get('/room/:id/', function(req, res){
        var id = req.params.id;
        var roomName;
        var roomId;
        for(var i = 0; i < rooms.length; i++){
          var room = rooms[i];
            if(room.number == id){
                roomName = room.name;
                roomId = room.roomId;
            }
        }
        if(roomName == null){
            res.status(404).sendFile(__dirname + '/error.html');
        }else{
            db.find(roomId).then(function(messages){
                res.set('Content-Type', 'text/html');
            res.status(200).send(ejs.render(indexEJS, {title: roomName, id: roomId, messages: messages}));
            }, function(error){
                res.status(500).send("Uh oh! An error ocurred: " + error.message);
            });
        }
    });
    //Inside io.on("connection", ...
    socket.on('chat message', function(msg){
                if(!verifyEmptyness(msg.message)){
                    var result = processMessage(msg);
                    if(result.sendToAll === true){
                        io.in(socket.handshake.query.room).emit('chat message', result.message);
                        db.add(result.message, socket.handshake.query.room);
                    }else{
                        socket.emit('chat message', result.message);
                    }
                }else{
                    var time = moment(msg.date).format("LT, D/M");
                    socket.emit('chat message', generateMessage("You may not send empty messages", time, false));
                }
            });
    

    【讨论】:

    • 谢谢!我去看看。我对 NoSQL 数据库不太熟悉,想知道 Redis 是否可以实现这一点?如果不是,那么在同一台服务器上安装 mysql、redis 和 MongoDB 可能会影响 CPU 和 RAM 的使用?
    • 嗯,这可能是性能问题,具体取决于您的服务器。如果它有足够的力量,那将不是问题。
    • 但是,如果 Redis 确实可以做到这一点,那么我不知道该怎么做,抱歉。
    猜你喜欢
    • 1970-01-01
    • 2012-01-29
    • 1970-01-01
    • 2013-08-08
    • 2011-11-20
    • 2015-09-25
    • 2012-01-29
    • 1970-01-01
    • 2016-10-13
    相关资源
    最近更新 更多