0
まずは、英語があまり良くない場合は申し訳ありません。socket.emitに特殊文字を含むエラーがあります
私はsocket.ioとnodeJSでチャットをしようとしています:
は、ユーザーがノードのサーバーにメッセージを送信し、それらが接続されているすべてのクライアントに正しく送信されます。
メッセージは「履歴」変数に保存されるため、新しい接続では何が話されたかがわかります。
「¿」などの特殊文字が履歴varに格納されている場合が問題です。
ソースコード(サーバー):
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キーを押すと
。 ...これは起こる:
私は何ができますか??コード以下F5を押し上