Socket.io一些emmits不会触发,而其他人不会触发
我一直在尝试熟悉socket.io,因此在实时应用程序中使用它。我经历了一个基本的例子,一个聊天室,然后我用ngrok与不止一个客户端进行测试,这很好。现在我正在寻找使用TAFFY来保存会话日志,将其部署到连接到它的新用户,所以我添加了另一个emmit来发送该日志,而且这个特殊的emmit似乎从未触发过句子在客户端。Socket.io一些emmits不会触发,而其他人不会触发
这些服务器的说明
io.on('connection', function(socket){
console.log("someone connected");
var chatLog={log:[]};
log().each(function (iter){ //this is the taffy var
chatLog.log.push({"usr":iter.usr,"msg":iter.msg});
});
var stringLog=JSON.stringify(chatLog);
console.log(stringLog);
socket.emit('cargaLog', stringLog);// THIS is the naughty emmit
socket.on('chat message', function(msg){
var mensaje=JSON.parse(msg);
log.insert({"usr":mensaje.usr,
"msg":mensaje.msg
});
io.emit('chat message', mensaje.usr.toUpperCase()+" dice: "+mensaje.msg);
});
});
客户的侧
$(function() {
var socket = io();
socket.on('cargaLog', function(log){
alert(log); //this never happens
console.log(log);
});
$('form').submit(function(){
var mensaje=$('#m').val();
var json='{"usr":"'+person+'","msg":"'+mensaje+'"}';
socket.emit('chat message', json);
$('#m').val('');
return false;
});
socket.on('chat message', function(msg){
var html='<li><img src="defaultUsrImg.png" alt="Usr_img" heigth="40" width="40">'+(msg)+'</li>';
$('#messages').append(html);
window.scrollTo(0, document.body.scrollHeight);
});
});
我在这段代码有一阵子一直盯着,并没有与其他人的工作,我工作的解决方案(即在客户端使用io.connect()或io.connect('http://0.0.0.0:8080'),或者使用客户端的emmit来请求服务器emmit被触发)。
任何人有任何想法,为什么会发生这种情况? 可选地,任何人有任何想法可以帮助我更好地排除故障?
其他细节: 运行Windows 10 节点版本8.2.1 socket.io版本2.0.3
这我如何使用节点要求:
var TAFFY = require('taffy');
var express=require('express');
var app = express();
var http = require('http');
var path=require('path');
var port = process.env.PORT || 3000;
var server= http.createServer(app).listen(port);
var io = require('socket.io').listen(server);
var log=TAFFY({"usr":"SERVER",
"msg":"WELCOME"
});
app.use(express.static(__dirname + '/public'));
app.get('/', function(req, res){
res.sendFile(__dirname + '/index.html');
});
客户端HTML代码(仅因为mt html包含了boddy而且它会长得太长
<body>
<ul id="messages"></ul>
<form action="">
<input id="m" autocomplete="off" /><button>Send</button>
</form>
<script type="text/javascript" src="./socket.io/socket.io.js"></script>
<script src="jquery-3.2.1.min.js"></script>
<!-- <script src="/mensajes.js"></script> THIS IS THE OLD CODE-->
<script >
var person = prompt("Introduce tu nombre o seudonimo", "anon"); //THIS IS THE WORKING CODE
if(person === null || person===""){
alert("Necesitas un nombre para participar");
}
else{
$(function() {
var socket = io();
socket.emit('ia iege',person);
socket.on('usrConectado',function(usr){
var html='<li><h6>'+(usr)+' se ha conectado</h6></li>';
$('#messages').append(html);
window.scrollTo(0, document.body.scrollHeight);
});
$('form').submit(function(){
var mensaje=$('#m').val();
var json='{"usr":"'+person+'","msg":"'+mensaje+'"}';
socket.emit('chat message', json);
$('#m').val('');
return false;
});
socket.on('chat message', function(msg){
var html='<li><img src="https://dujrsrsgsd3nh.cloudfront.net/img/emoticons/419693/pedreiro-1500067445.PNG" alt="Usr_img" heigth="40" width="40">'+(msg)+'</li>';
$('#messages').append(html);
window.scrollTo(0, document.body.scrollHeight);
});
socket.on('cargaLog', function(log){
console.log(log);
var oldLog=JSON.parse(log);
cargaLog(oldLog);
});
});
function cargaLog(newLog){
//newLog is an object
newLog.log.forEach(function(iter){
var msg=iter.usr.toUpperCase()+' dijo: '+iter.msg;
var html='<li><img src="https://dujrsrsgsd3nh.cloudfront.net/img/emoticons/419693/pedreiro-1500067445.PNG" alt="Usr_img" heigth="40" width="40">'+(msg)+'</li>';
$('#messages').append(html);
window.scrollTo(0, document.body.scrollHeight);
});
}
}
</script>
</body>
我将您的代码简化为基础知识,我收到的信息很好,您遇到了问题。下面是减少代码工作得很好:
Server代码:
var express = require('express');
var app = express();
var http = require('http');
var path = require('path');
var port = process.env.PORT || 3000;
var server= http.createServer(app).listen(port);
var io = require('socket.io').listen(server);
app.get('/', function(req, res){
res.sendFile(__dirname + '/s1.html');
});
io.on('connection', function(socket) {
console.log("someone connected");
var chatLog = {log: [{usr: "someuser", msg: "somemsg"}]};
var stringLog = JSON.stringify(chatLog);
console.log(stringLog);
socket.emit('cargaLog', stringLog); // THIS is the naughty emmit
});
客户端代码:
<html>
<head>
<script src="/socket.io/socket.io.js"></script>
<script src="http://code.jquery.com/jquery-3.2.1.js" integrity="sha256-DZAnKJ/6XZ9si04Hgrsxu/8s717jcIzLy3oi35EouyE=" crossorigin="anonymous"></script>
<script>
function dbg(x) {
let str = x;
if (typeof x === "object") {
str = JSON.stringify(x);
}
$("#log").append("<div>" + str + "</div>");
}
$(function() {
var socket = io();
socket.on('cargaLog', function(log) {
dbg(log);
});
});
</script>
</head>
<body>
Empty Content, waiting for message to arrive.
<div id="log"></div>
</body>
</html>
当我加载页面时,浏览器将立即显示,你是具有cargaLog消息麻烦与。我建议你回溯到这种超级简单的东西,直到你证明它有效,然后一次添加一件东西,直到找到引发问题的东西。如果这段代码不适合你,那么你必须在你的环境中搞点东西,我可能会重新安装各种组件(socket.io,node.js,express等等)。
这有很多帮助,这是客户方的错,出于某种原因,我需要在html文件中有正确的脚本,这样所有的emmits才能正常工作,你知道为什么这是jfriend吗? 谢谢你的全力帮助 –
@LuisL - 如果你向我展示整个客户端页面和问题所在,我可能会发现问题所在。我不明白你的描述和你展示的有限代码。 – jfriend00
我加了
代码段我觉得有关部分。 –
尝试
socket.emit('chat message' , { usr: person, msg: mensaje});
我不认为这是'.emit()'OP是询问。我想他们问的是这个:'socket.emit('cargaLog',stringLog);'。 – jfriend00
事实上,基本的聊天工作正常,工作正常,叫做'cargaLog',从不出现 –
我想你可以试着看看这个存储库https://github.com/egin10/socket-chat-example/blob/master/app.js为你的server
方。
,你可以尝试为您client
侧https://github.com/egin10/socket-chat-example/blob/master/chat.html
注意这一个:只记得大约socket.on(params, callback)
,它是从emmiter获取数据,并io.emit(params, obj)
上server
侧是emmiting数据。
所以,你必须确保关于什么是你的emmiting到server
或client
,什么是从server
或client
您取(socket.on()
)必须具有相同的params
。
而且您必须确定您的物品是var chatLog={log:[]};
。如果你想得到log
,你必须这样做chatLog.log
。
这对我有用。我希望它能帮助你。
是的,因为这是一个基本的应用程序,我选择将每个参数作为字符串传递,这就是为什么我将chatlog对象和客户端像其他任何字符串一样简单地打印它。如果一切正常,我会简单解析JSON回到客户端的一个对象 –
'var json ='{“usr”:''+ person +'“,”msg“:”'+ mensaje +'“}' ;'人'变量在哪里?你有没有定义它? – egin10
是的,它是一个变量,通过脚本开始时的提示获得,这些消息的工作方式应该是这样的:emmit叫做'cargaLog' –
对于您已经完成的故障排除,我们需要一些帮助。你是否从服务器端的控制台消息:'console.log(“someone connected”);'你是否看到这个日志消息:'console.log(stringLog);'?他们是你期望他们是什么?我想知道是否在'socket.emit('cargaLog',stringLog)'之前的东西抛出一个异常,所以它永远不会到那行代码。 – jfriend00
你应该问一个实际的问题。 – Difster
是@ jfriend00这些日志显示了当某人连接并且TAFFY变量正在保存它所需的内容时它们应该显示的内容。此外服务器运行得很好,人们仍然可以通过NGROK连接 –