socket.io/?EIO=3&transport=polling&t=1345678不收费

我使用node.js,express和socket.io进行了聊天。 这是app.js代码:

var express = require('express'), app = express(), server = require('http').createServer(app), io = require('socket.io').listen(server); server.listen(process.env.PORT || 8080); app.use(express.static(__dirname + '/')); io.on('connection', function(socket){ socket.on('message sent', function(data){ io.emit('receive', { msg: data.msg, uname: data.uname, uid: data.uid, uimg: data.uimg }); }); socket.on('message sent room', function(data){ console.log(data.mid); io.in(data.uroom).emit('receive', { msg: data.msg, uname: data.uname, uid: data.uid, uimg: data.uimg, mid: data.mid }); }); socket.on('join', function(data){ io.emit('join user', { uname: data.uname, uid: data.uid }); }); socket.on('create', function (room) { socket.join(room); }); }); 

这是我的haml文件上的代码

  %script{:src => "https://cdn.socket.io/socket.io-1.2.0.js"} - if Rails.env.production? :javascript var socket = io.connect('https://myherokuappurl.herokuapp.com/'); - else :javascript var socket = io.connect('http://localhost:8080/'); :javascript var userId = "#{current_user.id}"; var userName = "#{current_user.name}"; var userImg = "#{@userImage}"; var room = "#{@conversation.id}"; var messageId = 0; $(document).ready(function(){ socket.emit('create', room); $( "#m" ).focus(); var wtf = $('.panel-chat'); var height = wtf[0].scrollHeight; wtf.scrollTop(height); }); $('form').submit(function(){ var message = $('#m').val(); $.ajax({ type: "POST", url: "#{dashboard_messages_path}", dataType : 'json', data: {'message' : {'conversation_id': room, 'body': message, 'user_id': userId} }, success: function(data) { console.log(data.id); messageId = data.id; socket.emit('message sent room', {msg: $('#m').val(), uname: userName, uid: userId, uimg: userImg, uroom: room, mid: messageId}); $('#m').val(''); } }); return false; }); socket.on('receive', function(data){ var message = '<tr><td class="td-chat"><div class="text-center"><img alt="'+data.uname+'" class="avatar center-block" src="'+data.uimg+'" height="60" width="60"></div></td><td><small><strong>'+data.uname+':<br></strong></small>'+data.msg+'</td></tr>'; var currentMessageId = data.mid; if (data.uid != userId) { $.ajax({ type: "GET", url: "#{dashboard_message_read_path}", dataType : 'json', data: {'message_id':currentMessageId } }); } $("#table-chat").append(message); var wtf = $('.panel-chat'); var height = wtf[0].scrollHeight; wtf.scrollTop(height); }); socket.on('join user', function(data){ if (data.uid != userId) { $("#userjoin").text(data.uname + " se ha unido!").show().fadeOut(5000); } }); 

但为了使这个工作,我必须刷新聊天页面。 我注意到,用户第一次进入聊天页面时,它没有以下文件:

https://myherokuappurl.herokuapp.com/socket.io/?EIO=3&transport=polling&t=1xxxxxx-0

或者在我的本地机器上

HTTP://本地主机:8080 / socket.io / EIO = 3&运输=轮询&T = 1xxxxxx-0

所以聊天没有发送消息,而是当你按回车发送消息,页面刷新,这一次我有以下文件,一切都很好。

https://myherokuappurl.herokuapp.com/socket.io/?EIO=3&transport=polling&t=1xxxxxx-0

或者在我的本地机器上

HTTP://本地主机:8080 / socket.io / EIO = 3&运输=轮询&T = 1xxxxxx-0

这里可能是什么问题,因为这种行为发生在我的本地机器和生产。

在此先感谢您的帮助。

虽然我认为Bradgnar可能是正确的,但也可能遇到加载问题:第一次用户没有加载cdn资源。 但是在提交时和刷新页面之后,文件会立即加载。 如果这是问题,您的io.connect命令不执行,因为io不存在。 将任何实际的初始化移到document.ready方法。

我认为问题在于你的客户端代码是在ajax事件中包装你的套接字。 你应该使用事件来发送消息与套接字。

发生的事情是,在表单提交成功的时候,你正在发送一个事件来发送消息给服务器。 所有这一切都是正确的,因为它是写的,但数据stream是错误的,因为你不应该做表单提交。 David Walsh的这篇文章有一个简单的例子和​​一个可下载的例子的zip文件,你可以看看/可能工作。