簡體   English   中英

Socket.io:不發出特定的socket.id

[英]Socket.io: Not emitting to specific socket.id

我試圖遍歷每個用戶的套接字數組,並通過他們的socketId發送消息...但是由於某種原因,它沒有在前端接收它。

我在下面嘗試了這些,但無濟於事。

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

將消息發送到Socket.IO 1.0中的特定ID

Socket.io:無法使用socket.id將消息發送到特定套接字

后端:

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' ] }]

編輯2

新增:用戶通過passport.js(facebook auth)登錄后,重定向導致套接字斷開連接,因此socket.id變得無效...現在的問題是它無法重新建立連接...即使使用forceNew : true

解決了:

問題1:重新連接失敗。

斷開連接(在Passport登錄身份驗證之后)時,socket.io並未重新建立連接,因此我在數據庫中擁有的socketId變得過時了。 通過將其添加到客戶端io.on('connect')來解決此問題:

{ 'forceNew' : true }

問題2:本地測試環境

我的測試過程要求將消息發送給其他計算機上的用戶。 我們正在兩個單獨的本地服務器上進行測試,因此我們試圖向彼此的本地主機發出信號。 當我們將測試轉移到單個服務器上時,套接字按預期開始工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM