2016-06-24 3 views
0

У меня есть простое приложение nodejs с сокетами, и я столкнулся с ошибкой, когда я не могу найти какое-либо решение. Поэтому я выбраю приложение из клиента и ничего не происходит. Или клиент не может его получить - я не знаю, потому что не могу проверить, успешно ли он был отправлен клиенту. Это ошибка, я получил, когда я пытался отладки обратного вызова выделяют:nodejs не передает данные клиенту

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 .. Ничего не происходит, и кажется, что его даже не отправили из узла. Какие-либо предложения?

ответ

0

Проблема была в моей логике - я отправлял онлайн-счет только в том случае, если новый пользователь подключился/отключился. Проблема была решена путем добавления функции для повторения каждые несколько секунд и отправки онлайн-счета на клиентскую сторону.

Смежные вопросы