2015-04-25 3 views
0

Я пытаюсь пропустить каждый из сокетов каждого пользователя и отправить сообщение через свой socketId ... но по какой-то причине он не получает его на переднем конце.Socket.io: Не испускать конкретный socket.id

Я пробовал эти ниже, но безрезультатно.

https://github.com/Automattic/socket.io/issues/1618

Sending message to a specific ID in Socket.IO 1.0

Socket.io: Not able send message to particular socket using socket.id

Backend:

users.forEach(function(subDoc){ 
    console.log('>> notifyOnline: iterating user...') 
    console.log(subDoc); 

    // for every socket, send out an emit. 
    for (var j = 0, arr = subDoc.socketId.length; j < arr; j++) { 
    console.log('>> notfiyOnline: sending out good thoughts to clients...'); 
    console.log('>> EMITTING' + subDoc.socketId[j] + 'is type ' + typeof subDoc.socketId[j]); 

    // These don't seem to do anything 
    io.sockets.to(subDoc.socketId[j]).emit('notification:new', packet); 
    io.to(subDoc.socketId[j]).emit('notification:new', packet); 

    }; // end - for each socket 
}); // end - forEach user 

Фронтенд:

// Listens for users followed online 
    socketFactory.on('notification:new', function (data) { 
    console.log('>> worldCtrl: Received live notification'); 
    console.log(data); 
    $scope.$applyAsync(function() { 
     $scope.rootUser.notifications.push(data); 
    }); 
    }); // end - socketFactory 

Редактировать

@ jfriend00: Структура данных для каждого пользователя ниже. Я не добавил код для очистки старого socketId, поэтому некоторые из них неактивны. Это результат запроса мангустов:

// Mongoose Query: 
model_onlineUser.find({ 'user._id' : { $in: followers }}, function (err, users) { 
    // notify users (backend code above) 
}); // end - find 

// Data structure: user in users 
[{ _id: 553b49db2242347514c654a9, 
    user: 
    { _id: '5503530ed3e910505be02cde', 
    displayName: 'some dudes name', 
    photo: 'some photo url' }, 
    __v: 28, 
    followers: 
    [ '5525d19a5fb4ee095072c4ad', 
    '5525587a04f79c6e4d65015d', 
    '55067b0638d1c47238ebabbb' ], 
    socketId: 
    [ '2K1_8WQ1JZMUjLx3AAAF', 
    'xJqixhGiRb5HYxcoAAAD', 
    '7fDqV_DBP3FCTIlLAAAF' ] }] 

Edit 2

Новое: После того, как пользователь Войти через facebook passport.js (AUTH), редирект вызывает гнездо для отключения, так socket.id становится недействительным ... проблема в том, что она не восстанавливает соединение ... даже с forceNew : true.

+1

Что такое 'users' и как оно построено? – jfriend00

ответ

0

Решено:

Задача 1: Отказ воссоединиться.

При отключении (после аутентификации в режиме Passport) socket.io не восстановил соединение, поэтому socketId, который у меня был в базе данных, устарел. Эта задача была решена путем добавления этого клиенту io.on('connect'):

{ 'forceNew' : true } 

проблема 2: Локальные среды тестирования

Мои процедуры тестирования требуется отправка сообщений пользователям на других компьютерах. Мы тестировали два отдельных локальных сервера, поэтому мы пытались испускать локальный хост друг друга. Когда мы перенесли тестирование на один сервер, сокеты начали работать как ожидалось.

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