nodejs不向客户端发送数据

时间:2016-06-24 22:17:51

标签: javascript node.js sockets

我有简单的带有套接字的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 ..没有任何事情发生,似乎它甚至没有从节点应用程序发送。有什么建议吗?

1 个答案:

答案 0 :(得分:0)

问题在于我的逻辑 - 我只是在新用户连接/断开连接时才发送在线计数。通过添加函数来解决问题,每隔几秒钟重复一次,并将在线计数发送给客户端。