node.js - socket.io/?EIO=3&transport=polling&t=1345678 不充电

标签 node.js sockets ruby-on-rails-4 heroku

我使用 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://localhost:8080/socket.io/?EIO=3&transport=polling&t=1xxxxxx-0

所以聊天不会发送消息,而是当您按回车键发送消息时,页面会刷新,这次我有以下文件,一切正常。

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

或者这个在我的本地机器上

http://localhost:8080/socket.io/?EIO=3&transport=polling&t=1xxxxxx-0

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

在此先感谢您的帮助。

最佳答案

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

关于node.js - socket.io/?EIO=3&transport=polling&t=1345678 不充电,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31903130/

相关文章:

C、TCP、recvAll block 未接收任何内容

javascript - 页面刷新后显示内部服务器错误(使用 websocket-rails)

javascript - 在模板引擎中渲染页面后获取页面的源代码?

javascript - 验证数据然后返回解析?

c# - 向使用 SocketAsyncEventArgs 构建的服务器添加加密

我可以通过两者之间的服务器实现客户端 - 客户端通信吗?

amazon-s3 - 在 s3 上设置 Fog 存储文件的 content_type

ruby-on-rails - 如何在 Rails 4 中使用 Tire gem 和 WillPaginate 对结果进行分页

node.js - 如何在multer中实现if(!= req.file)?

sql-server - Node/繁琐示例中的表值参数