【问题标题】:Socket io only emits data upon page reloadSocket io 仅在页面重新加载时发出数据
【发布时间】:2016-08-03 01:06:20
【问题描述】:

在 express.js 项目中,我尝试将数据从 nodeJS 服务器发送到客户端。

到达页面后,终端(我从中启动服务器)表明用户已通过套接字连接。然而,在运行包含套接字发射函数的函数时,什么也没有发生。

只有在重新加载网页时,发出的数据才会出现在 html 和终端控制台日志中。

以下是在 app.js 中的回调函数中触发套接字的代码

foo(function(fooCallback) {
    console.log('Callback triggered');

    io.on('connection', function(socket) {
        console.log('about to send data via socket');
        io.sockets.emit('person', { 'name': 'Jack Smith' });

    });
});

global.js -(在 jquery 和 socket 脚本之后加载的客户端 js)

    var socket = io.connect();
    socket.on('person', function(socket){
        console.log('client recieved something from socket');
        var personName = socket.name;
        $('#person').html(personName);
    });

为什么只有在重新加载网页时才会发出数据,而不是自动发出?

【问题讨论】:

    标签: javascript node.js express socket.io page-refresh


    【解决方案1】:

    在这部分代码中:

    io.on('connection', function(socket) {
        console.log('about to send data via socket');
        io.sockets.emit('person', { 'name': 'Jack Smith' });
    });
    

    您说您只想在io 变量首次连接时运行io.sockets.emit('person', { 'name': 'Jack Smith' });。尝试将其更改为:

    io.on('connection', function(socket) {
        console.log('about to send data via socket');
    });
    
    io.sockets.emit('person', { 'name': 'Jack Smith' });
    

    【讨论】:

    • 但是,这怎么可能?在io.sockets.emit() 运行时,它是在服务器初始化期间,所以还没有连接套接字,所以它什么也不做。我想知道它是否应该像以前一样在连接回调中,而是应该是socket.emit(...),所以它只发送到刚刚连接的套接字?
    【解决方案2】:

    您的问题是服务器将连接消息传播得太晚,以至于您的应用在第一次加载时无法检测到该消息。我不确定你为什么要使用这样的 foo 回调函数。你的 io.on 连接逻辑应该直接放在你的主 js 文件中。但是,一种可能的方法是初始化您的 var io = io();在那个 foo 函数里面

    【讨论】:

      猜你喜欢
      • 2023-03-27
      • 2014-10-02
      • 2019-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多