【问题标题】:Error in socket.emit with special characters带有特殊字符的 socket.emit 中的错误
【发布时间】:2018-04-26 09:29:11
【问题描述】:

首先,对不起,如果我的英语不是很好。

我正在尝试在 nodeJS 中使用 socket.io 进行聊天:

  • 用户向节点服务器发送消息,并正确发送给所有连接的客户端。

  • 消息保存在“历史”变量中,因此新连接可以看到所说的内容。

问题是当一个特殊字符存储在历史变量中时,例如“¿”。

源代码(服务器):

var io = require('socket.io')(3333);

var historico_mensajes = [];

console.log('Iniciando aplicacion');

io.on('connection',function(socket) {
    console.log('Nueva conexion');
    console.log(historico_mensajes);

    socket.emit("chat_hist",{ historico_mensajes });

    socket.on('chat_msg',function(data){
        console.log("Msg no escapado: "+data.msg);
        if(data.msg.length>150) {
            socket.emit('sv_chat_msg', {
                type: 'error',
                msg: 'too long'
            });
        } else {
            io.sockets.emit('sv_chat_msg', {
                type: 'chat',
                msg: data.msg,
                name: 'Test name',
                icon: 'Test icon',
                user: 'Test user',
                rank: 'Test rank'
            });
            historico_mensajes.push({
                    type: 'chat',
                    msg: data.msg,
                    name: 'Test name',
                    icon: 'Test icon',
                    user: 'Test user',
                    rank: 'Test rank'
            });
            if(historico_mensajes.length > 15) { historico_mensajes.splice(0,1); }

        }
    });
});

源代码(客户端):

var HOST = "http://127.0.0.1:3333";
var SOCKET = null;

$(document).ready(function() {
    connect();
});

function connect() {
    if (!SOCKET) {
        console.log("Connecting to server...");
        SOCKET = io(HOST);
        SOCKET.on('connect', function() {
            console.log("Established connection!");
        });
        SOCKET.on('chat_hist', function(m=null) {
            console.log("chat hist recibido");
            console.log(m);
            /*
            if(m) {
                for (var ms = 0; ms < m.historico_mjs.length; ms++) {
                    chat("user", m.historico_mjs[ms].name, m.historico_mjs[ms].msg, m.historico_mjs[ms].icon, m.historico_mjs[ms].rank);
                }
            } else {
                console.log("no historico");
            }
            */
        });     
        SOCKET.on('sv_chat_msg', function(data) {
            console.log("mensaje del server recibido para el usuario");
            switch(data.type) {
                case "error":
                    chat('bot_errors','Test Bot',data.msg);
                    break;
                case "chat":
                    chat('user',data.name,data.msg,data.icon,data.rank);
                    break;
                default:
                    chat('bot','Test Bot','Unknow msg');
                    break;
            }
        });
    }
}

if (!String.prototype.format) {
    String.prototype.format = function() {
        var args = arguments;
        return this.replace(/{(\d+)}/g, function(match, number) {
            return typeof args[number] != 'undefined' ? args[number] : match;
        });
    };
}

function chat(tipo,name,msg,avatar,rank){
    var toChat = "";
    if(msg && name) {
        msg = msg.replace(/(<|>)/g, '');
        name = name.replace(/(<|>)/g, '');
        switch(tipo) {
            case "bot":
                toChat='<li><div class="comment-box"><header class="header"><span class="cmt-user-level">100</span><a href="#" data-show-profile="001"><img width="18px" src="images/crown.png" alt="user snap" /><em style="color:#ff8b00;">'+name+'</em></a></header><div class="text" style="color:#ff9800;">'+msg+'</div><span class="remove-comment"><i class="flaticon-remove-user"></i></span></div></li>';
                break;
            case "bot_errors":
                toChat='<li><div class="comment-box"><header class="header"><span class="cmt-user-level">100</span><a href="#" data-show-profile="001"><img width="18px" src="images/crown.png" alt="user snap" /><em style="color:#ff8b00;">'+name+'</em></a></header><div class="text" style="color:#a94442;">'+msg+'</div><span class="remove-comment"><i class="flaticon-remove-user"></i></span></div></li>';
                break;
            case "user":
                toChat='<li><div class="comment-box"><header class="header"><span class="cmt-user-level">'+rank+'</span><a href="#" data-show-profile="001"><img width="18px" src="'+avatar+'" alt="user snap" /><em>'+name+'</em></a></header><div class="text">'+msg+'</div><span class="remove-comment"><i class="flaticon-remove-user"></i></span></div></li>';
                break;
        }

        $("#chatArea").append(toChat);
    }
}

例子:

当我发送普通字符时,一切正常:

如果按 F5 并通过聊天获取数组:

但是...如果我发送带有“¿”字符集的消息:

如果我现在按 F5... 会发生这种情况:

我能做什么??

【问题讨论】:

    标签: node.js sockets


    【解决方案1】:

    在按下 F5 时会运行以下代码:

    SOCKET.on('chat_hist', function(m=null) {
                console.log("chat hist recibido");
                console.log(m);//you fave commented code here
                m && m.historico_mjs.forEach(data=>chat('user',data.name,data.msg,data.icon,data.rank););
          });   
    

    完成上面的代码,它会将历史记录显示在屏幕上。请使用与上面类似的代码来获取结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-03
      • 2020-02-07
      • 2021-11-22
      • 1970-01-01
      • 1970-01-01
      • 2012-10-06
      • 2018-11-14
      • 2012-09-15
      相关资源
      最近更新 更多