【发布时间】:2023-04-09 15:17:01
【问题描述】:
我一直在尝试熟悉 socket.io,因此请在实时应用程序中使用它。我浏览了一个基本示例,一个聊天室,然后我使用 ngrok 对多个客户端进行了测试,一切都很好。现在我希望使用 TAFFY 保存对话日志,并将其部署到连接到它的新用户,因此我添加了另一个 emmit 来发送该日志,而这个特定的 emmit 似乎永远不会触发 on 客户端的语句。
这些是服务器说明
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 包含,它会太长
<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>
【问题讨论】:
-
我们需要一些帮助来解决您已经完成的故障排除。您是否从以下位置获取服务器端控制台消息:
console.log("someone connected");您是否看到此日志消息:console.log(stringLog);?他们是你期望他们成为的样子吗?我想知道socket.emit('cargaLog', stringLog);之前的某些东西是否会引发异常,因此它永远不会到达那行代码。 -
你应该问一个实际的问题。
-
是@jfriend00 日志准确显示了当有人连接时他们应该显示的内容,并且 TAFFY var 正在保存它必须显示的内容。此外,服务器运行良好,人们仍然可以通过 NGROK 进行连接
-
我不明白为什么它不起作用。猜测可能存在与在“刚刚连接”的套接字上发送消息相关的时间问题,您可以尝试在服务器上将其更改为:
socket.emit('cargaLog', stringLog);到此:setTimeout(function() {socket.emit('cargaLog', stringLog)}, 500);作为实验。 -
它并没有改变任何东西,我什至在 ubuntu 上尝试过它以确保它不是一些 windows 10 的恶作剧,它也是同样的问题。我将按照要求返回踏板,看看我执行服务的方式是否搞砸了。感谢朋友的帮助
标签: javascript html node.js socket.io taffy