Socket io 仅在页面重新加载时发出数据

Socket io only emits data upon page reload

在一个 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 和套接字脚本之后加载客户端 js)

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

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

在这段代码中:

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' });

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