【问题标题】:Node.js + socket.io return data on eventNode.js + socket.io 返回事件数据
【发布时间】:2013-05-21 11:05:29
【问题描述】:

我目前正在建立一个小型聊天室。

当有人点击回车时,它应该向服务器提交消息,如果插入成功则返回一些状态信息。

有没有办法在每个事件上返回一些数据,还是我必须从服务器发起另一个发送来通知客户端状态?

客户

$('textarea').keypress(function(e) {

    if(e.which == 13) {

                var msg = $.trim(this.value);

                if(msg.length > 0) {

                        socket.send(msg, function() {

                             // Here I need to have some result
                             // returned by the server to notify the user
                             // if everything went fine
                             //this.value = '';
                        });
                }

                return false;
        }
});

服务器

socket.on('message', function() {

        db.query("INSERT INTO chat (message, ip, time) VALUES (?, INET_ATON(?), NOW())", [msg, socket.handshake.headers['x-forwarded-for'] || socket.handshake.address.address], function(error) {

                if(!error) {
                        io.sockets.send(msg);
                } else {
                        console.log(error);
                }

        });
});

【问题讨论】:

    标签: node.js chat socket.io


    【解决方案1】:

    我最近遇到了这个问题。我的解决方案是在每条消息中添加一个命令 ID。我构建了一个小函数来在客户端创建一个 ID (here)。所以流程看起来像这样:

    客户

    • 当用户做了一些需要保存的事情时:
    • 为命令生成一个 ID
    • 生成描述命令的对象
    • 通过套接字向服务器发送命令

    服务器

    • 接收命令消息
    • 应用命令(数据库等)
    • 如果命令成功,则通过套接字将命令 ID 以“命令完成”消息类型发送回客户端

    客户

    • 接收命令完成消息
    • 在客户端将该命令标记为“完成”

    服务器端步骤的代码:

    socket.on 'du', (msg) =>
      @saveData(msg, ->
        # broadcast to other users if needed
        socket.emit('cc', msg.data.commandId)
      )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-19
      • 2012-09-13
      相关资源
      最近更新 更多