我一直在嘗試熟悉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>
對於您已經完成的故障排除,我們需要一些幫助。你是否從服務器端的控制檯消息:'console.log(「someone connected」);'你是否看到這個日誌消息:'console.log(stringLog);'?他們是你期望他們是什麼?我想知道是否在'socket.emit('cargaLog',stringLog)'之前的東西拋出一個異常,所以它永遠不會到那行代碼。 – jfriend00
你應該問一個實際的問題。 – Difster
是@ jfriend00這些日誌顯示了當某人連接並且TAFFY變量正在保存它所需的內容時它們應該顯示的內容。此外服務器運行得很好,人們仍然可以通過NGROK連接 –