2014-10-10 15 views
5

Poniżej znajduje się kod na przednim końcu, gdzie storeSelUserId zawiera user_id wysłać wiadomości-Wyślij do poszczególnych użytkowników korzystających socket.io

FYI - węzeł Version 1.1.0

// Socket Notification 
var socket = io('http://localhost:6868'); 
socket.on('connection', function (data) { 
    socket.emit('send notification', { sent_to: storeSelUserId }); 
}); 

Poniżej znajduje się kod serwera w pliku tras -

var clients = {}; 
io.on('connection', function (socket) { 
    socket.emit('connection', "Connection Created."); 
    socket.on('send notification', function (sent_to) { 
    console.log(sent_to); 
    }); 
}); 

w konsoli jest pokazując sent_to array of user_id.

Teraz jako starter w socket.io utknąłem z rozwiązaniem, w jaki sposób wysłać wiadomość do tych konkretnych użytkowników.

wyszukiwać i okazało się, że muszę pchnąć każdego użytkownika z jego gniazda, więc zreformować go -

var users = []; 
io.on('connection', function (socket) { 
    users.push({socket_id: socket.id}); 
    socket.emit('connection', "Connection Created."); 
    socket.on('send notification', function (sent_to) { 
    console.log(sent_to); 
    }); 
}); 

Ale jestem w dylemat, że jeszcze muszę zrobić, żeby zapisywać, które user_id odnosi się do którego socket_id, a następnie zaktualizować div użytkowników o te konkretne identyfikatory?

EDIT -

Dodaj Controller - (Front End)

Przednia Interfejs gdzie notatka jest tworzony i wysłać do poszczególnych użytkowników

var socket = io('http://localhost:6868'); 
socket.on('connection', function (data) { 
    socket.emit('send memo notification', {creator_id: creator_id, sent_to: [Array of user_ids to whom memo to send]}); 
}); 

kontroler Dashboard - (Przód)

Interfejs Zaczepy gdzie liczba powiadomienie, aby wyświetlić "notificationCount"

if (SessionService.currentUser._id) { 
    var socket = io('http://localhost:6868'); 
    socket.on('connection', function (data) { 
     socket.emit('get notifications', {user_id: SessionService.currentUser._id}); 
    }); 

    socket.on('notification data', function(data){ 
     console.log("-- Not Data Test -"); 
     $scope.notificationCount = data.length; 
    }); 
} 

kod na końcu serwera -

io.on('connection', function (socket) { 

    socket.emit('connection', "Connection Created."); 

    socket.on('send memo notification', function(data) { 
     notifications.createNotification(data); 
    }); 

    socket.on('get notifications', function(data){ 
    notifications.getNotifications(data, function(response){ 
     socket.emit('notification data', response.data); 
    }); 
    }); 

}); 

Backend kod kontrolera -

exports.getNotifications = function(data, callback) { 
    var userId = data.user_id; 
    Notification.find({receiver_id: userId}, function(err, response){ 
     if (err) 
      callback({"message": "error", "data": err, "status_code": "500"}); 
     else 
      callback({"message": "success", "data": response, "status_code": "200"}); 
    }); 
}; 

exports.createNotification = function(data) { 
    var notificationData = data; 
    var x = 0; 
    for(var i=0; i< notificationData.length; i++) { 
     // Code 
     Notification(notificationData[i]).save(function(err,response){ 
      if (err) 
       return false; 
     });  
     if (x === notificationData.length - 1) { 
      return true; 
     } 
     x++; 
    } 
}; 

Odpowiedz

18

Jeśli chcesz używać własnych identyfikatorów użytkowników, nie ma możliwości odwzorowania identyfikatora gniazda na identyfikator użytkownika. Zakładam, że klient zna skądś swój identyfikator użytkownika, więc może wysłać swój identyfikator użytkownika do serwera po nawiązaniu połączenia.

Client

socket.on('connection', function (data) { 
    socket.emit('setUserId', myUserId); 
}); 

Serwer zapisuje gniazdo dla każdego identyfikatora użytkownika.

socket.on('setUserId', function (userId) { 
    users[userId]=socket; 
}); 

Jeśli masz takie mapowanie na serwerze, możesz wysłać wiadomość tylko do tego klienta, używając identyfikatora użytkownika.

socket.on('send notification', function (userId) { 
    users[userId].emit('notification', "important notification message"); 
}); 

Edytuj: Bezpośrednie zapisanie odpowiedniego gniazda jest jeszcze lepsze.

+1

Proszę znaleźć moje edit..I nie dostaję automatyczną aktualizację na side..I klienckich muszą odświeżyć przeglądarkę wtedy tylko zmiana odzwierciedla – Trialcoder

+0

Daj mi znać, jeśli coś nadal będzie niejasne. – Trialcoder

3

Zgodnie z tym, co rozumiem, potrzebne jest prywatne powiadomienie wysyłane tylko do niektórych użytkowników. W tym celu zapisz nazwę użytkownika, do którego chcesz wysłać, oraz odpowiadające im gniazdo w różnych hasłach.

username [socket.name] = username to be added; 
usersocket [ socket.name ] =socket; 

Następnie emitować komunikaty tylko do danego użytkownika, należy użyć

usersocket[ socket.name ].emit('event for send message', ' what you want to send '); 
+0

Jeśli chcesz, mogę wysłać kod. –

+0

Proszę znaleźć moją edycję – Trialcoder

+0

Czy możesz po prostu przesłać aktualizację, aby móc ją wyszukać? –

Powiązane problemy