如何将聊天消息存储在数据库中?

Posted

技术标签:

【中文标题】如何将聊天消息存储在数据库中?【英文标题】:How to store chat messages in database? 【发布时间】:2018-09-30 10:32:02 【问题描述】:

我将 Node.js 与 Rails 一起用于一个基本的聊天应用程序。现在,当我刷新页面时,所有消息都会被删除。所以我想使用 AJAX 将消息存储在 rails 数据库中。 我怎样才能做到这一点?

nodejs/index.js

console.log("Server is starting...");

const http = require('http');

const hostname = '0.0.0.0';
const port = '8000';

console.log("Creating server...");

const server = http.createServer().listen(port, hostname);

console.log('chat server running on '+ hostname + ':' + port);

let socketList = require('socket.io').listen(server);

socketList.sockets.on('connection', function (socket) 
    console.log('connection received');
    console.log('socket in node = ', socket);

    socket.on('disconnect', function () 
        console.log('socket disconnected');
    );

    socket.on('join_room', function (data) 
        socket.join(data.chatroom);

        socketList.in(data.chatroom).emit('user_joined', 
           user_email: data.user_email,
           chatroom: data.chatroom
        );   
    );

    socket.on('send_message', function (data) 
        console.log(data.message, data.user_email);
        socketList.in(data.chatroom).emit('receive_message', 
            message: data.message,
            user_email: data.user_email
        );
    );
);

rails/application.js

window.addEventListener('load', function (ev) 

    var user_email = $('#current_user_email').html(); // checking if user login

    if(user_email)
        var socket = io.connect('http://0.0.0.0:8000');
        console.log('socket in rails = ' , socket);

        socket.on('connect', function () 
            console.log('connection established to node server');
        );

        socket.emit('join_room',
        
            user_email: user_email,
            chatroom: 'home'
        );

        socket.on('user_joined', function (data) 
            console.log(data.user_email + ' joined ' + data.chatroom);
        );

        $('#send-message').click(function () 
            let msg = $('#chat-message-input').val();

            if(msg !=='')
                socket.emit('send_message', 
                    message: msg,
                    user_email: user_email,
                    chatroom: 'home'
                );
            

            $('#chat-message-input').val('');
        );

        socket.on('receive_message', function (data) 
            console.log(data.user_email, data.message);

            let newMessage = $('<li>');
            let messageType = 'other-message';
            if (data.user_email === user_email)
                messageType = 'self-message';
            
            newMessage.addClass(messageType);

            newMessage.append($('<span>', 
                'html': data.message
            ));
            newMessage.append($('<sub>', 
                'html': data.user_email
            ));

            $('#chat-messages-list').append(newMessage);
        );

还有哪些不同的方法可用于将消息存储在数据库中? 我们也可以直接使用 Node.js 存储在 Rails 数据库中吗?

【问题讨论】:

你想存储什么只意味着messagesmessages with their sender name.? 发送者和接收者之间的消息,分别带有他们的名字。 查看***.com/questions/30823944/… 【参考方案1】:

不会写代码,但基本上你可以开始:

rails g scaffold Chat name:text chat:text

然后使用 ajax 发布到 /chat.json 设置数据,例如 name:user_name, chat:texxt

然后你还需要从 /chat.json 询问所有用户聊天 您还需要在索引函数中写入rails

if params[:id]) do
  @chat = Chat.find(name:username)
else 
  @chat = Chat.all
end

然后将这些消息显示给用户 但这是让你前进的基本概念

【讨论】:

对不起.. 不明白你想在这里表达什么?我在 application.js 中获取有关用户和消息的所有信息。那么我如何在 application.js 之外使用该信息来存储聊天记录 在 application.js 中,您将带有数据的 ajax 调用发送到您保存数据的 Rails 路由和您可以获取数据的另一条路由

以上是关于如何将聊天消息存储在数据库中?的主要内容,如果未能解决你的问题,请参考以下文章

是否有必要在将聊天消息存储到 Firebase 之前对其进行加密?

websocket服务器,存储数据

如何按最新消息对聊天列表进行排序?

如何将 FireBase 云消息传递令牌存储在 Android 的 firebase 数据库中?

iOS:使用 CoreData 的聊天应用程序

Firebase 网络将聊天存储为实时数据库中的数组