聊天服务器使用Nodejs& Socket.io:记录对话的最佳方式

时间:2015-02-13 14:12:33

标签: node.js socket.io

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

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

谢谢

1 个答案:

答案 0 :(得分: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));
            }
        });