【问题标题】:nodejs does not emit data to clientnodejs不会向客户端发送数据
【发布时间】:2016-06-25 06:32:13
【问题描述】:

我有一个带有套接字的简单 nodejs 应用程序,但我遇到了一个错误,我找不到任何解决方案。所以我从应用程序发射到客户端,没有任何反应。或者客户端无法接收它 - 我不知道,因为我无法检查它是否已成功发送给客户端。这是我在尝试调试 emit 回调时遇到的错误:

Error: Callbacks are not supported when broadcasting

这是我的应用代码:

    http.listen(6060, function () {
    console.log("Listening on *: 6060");
});

io.set('authorization', function (handshakeData, accept) {
    var domain = handshakeData.headers.referer.replace('http://', '').replace('https://', '').split(/[/?#]/)[0];

    if ('***' == domain) {
        accept(null, true);
    } else {
        return accept('You must be logged in to take an action in this site!', false);
    }
});

io.use(function (sock, next) {
    var handshakeData = sock.request;
    var userToken = handshakeData._query.key;

    if (typeof userToken !== null && userToken !== 0 && userToken !== '0' && userToken.length > 0) {
        connection.query('***',
            [xssfilter.filter(validator.escape(userToken))],
            function (error, data) {
                if (error) {
                    debug('Cant receive user data from database by token');
                    next(new Error('Failed to parse user data! Please login!'));
                } else {
                    // load data to this user.
                    _updateUsers(xssfilter.filter(validator.escape(userToken)), 'add', data[0], sock.id);
                    _loadPreData();

                    next(null, true);
                }
            });
    } else {
        debug('Cant receive user token');
        next(new Error('Failed to parse user data! Please login!'));
    }

    sock.on("disconnect", function () {
        _updateUsers(false, 'remove', false, sock.id);
    });
});

// we need to show people online count
io.emit('online-count', {
    count: Object.keys(connectedUsers).length
});

以及上面用到的函数:

    function _updateUsers(userToken, action, userData, sockedID) {
    switch (action) {
        case 'add':
            connectedUsers[sockedID] = {...};
            io.emit('online-count', io.emit('online-count', {
            count: Object.keys(connectedUsers).length
        }););

            break;
        case 'remove':
            delete connectedUsers[sockedID];
            io.emit('online-count', io.emit('online-count', {
            count: Object.keys(connectedUsers).length
        }););

            break;
    }
}

所以在发出online-count 之后,我应该在客户端接受它:

var socket;
socket = io(globalData.socketConn, {query: "key=" + globalData.userData.token});
socket.on('connect', function (data) {
    console.log('Client side successfully connected with APP.');
});
socket.on('error', function (err) {
    error('danger', 'top', err);
});

socket.on('online-count', function (data) {
    console.log('Got online count: ' + data.count);
    $('#online_count').html(data.count);
});

但问题在于这个online-count.. 没有任何反应,似乎它甚至不是从节点应用程序发送的。有什么建议吗?

【问题讨论】:

    标签: javascript node.js sockets


    【解决方案1】:

    问题出在我的逻辑上——我只在新用户连接/断开连接时才发送在线计数。通过添加每隔几秒重复一次并将在线计数发送到客户端的功能解决了问题。

    【讨论】:

      猜你喜欢
      • 2014-01-07
      • 2016-12-20
      • 2022-07-08
      • 2014-08-17
      • 2017-10-27
      • 2013-02-01
      • 2017-05-07
      • 1970-01-01
      • 2015-01-08
      相关资源
      最近更新 更多