我正在使用具有nodejs和socket.io的多个房间的聊天服务器。我想知道保存所有对话的最佳方法是什么?
我也在使用Mysql和Redis(会话)。我不确定MySQL是一个不错的选择,因为它会被重载,我需要它来显示其他页面内容。 扁平文件怎么样?这可能很棒,但在尝试保存新邮件时是否存在将文件打开的风险?
谢谢
答案 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));
}
});