2017-07-11 6 views
0

同じテーマでいくつかの質問があり、テーマはどれも私のために働いていませんでした。私はその過程で何かが欠けていると思う:ソケットは特定のユーザーに送信します

私は特定のユーザーにメッセージを送信したい。 私が使用:

サーバー(あなたが見ることができるように、私はセッションを処理するためにマングースを使用):その後、

const io = new SocketIo(server); 

io.use(socketioJwt.authorize({ 
    secret: configSocket.secret, 
    handshake: true 
})); 

// persistence store of our session 
const MongoStore = mongoStoreFactory(session); 

const sessionMiddleware = session({ 
    store: new MongoStore({ 
    mongooseConnection: mongoose.connection, 
    ttl: (1 * 60 * 60) // 1 hour 
    }), 
    secret: configSocket.secretSession, 
    httpOnly: true, 
    resave: false, 
    saveUninitialized: false, 
    // rolling: true, 
    // secure: true, 
    cookie: { maxAge: 86400000 } 
}); 
app.use(sessionMiddleware); 

... 

socketRouter(io); 

socketRouter機能

"express": "^4.13.3" 
"socket.io": "^1.3.7" 
"socket.io-client": "^1.3.7" 
"mongodb": "^2.2.2" 
"mongoose": "^4.5.4" 

は、ここに私のコードです。私はmongo dataStoreでユーザープロフィールのsocketIdを保存して、emitでユーザーを狙っています。

exports = module.exports = (io) => { 
    io.sockets.on('connection', (socket) => { 
    Users.findById(socket.decoded_token.sub, (err, user) => { 
     if (user) { 
     // if the user exists, save the socket Id in the user collection 
     Users.update({_id: user._id}, {$set: {socketId: socket.id}}, (err2, result) => { 

      // ------ PROTECTED ROUTES ------ // 

      // MOBILE CALLS 
      ... 

      // DASHBOARD CALLS 
      socket.on('forceNotif', (data) => Notif.force(data, io, socket)); 

      // ------------------------------ // 
     }); 
     } 
    }); 
    socket.on('disconnect',()=> { 
     Users.update({_id: socket.decoded_token.sub}, {$set: {socketId: null}}); 
    }); 
    }); 

「forceNotif」によって呼び出される関数。ここで私は別の動作を期待しています。私はソケットが特定のユーザー(要求を送信するものとは異なる)に値を送信するようにします。私はMongoDbからsocketIdを取得しますが、それは正確です。それから私は私の目的のためにそれを使いたい。いくつかの異なる命題がウェブ上で作られている。私は以下のことをテストした:

exports.force = (par, io, socket) => { 
    // retrieve the socket id of the user to aim 
    Users.findOne({_id: par.id}, {socketId: 1, pseudo: 1}, (err, res) => { 
    console.log('--------------------------------------------------'); 
    console.log('err: ', err); 
    console.log('pseudo: ', res.pseudo); 
    console.log('socketId: ', res.socketId); 
    // emit the value to a specific user 


    // not working 

    io.sockets.to(res.socket).emit('notifExtUpdate', {val: 'TO'}); 
    io.to(res.socket).emit('notifExtUpdate', {val: 'TO'}); 
    io.broadcast.to(res.socket).emit('notifExtUpdate', {val: 'TO'}); 
    socket.broadcast.to(res.socket).emit('notifExtUpdate', {val: 'TO'}); 
    socket.to(res.socket).emit('notifExtUpdate', {val: 'TO'}); 


    // working well, but not my purpose 

    io.emit('notifExtUpdate', {val: 'BROADCAST'}); 
    socket.broadcast.emit('notifExtUpdate', {val: 'BROADCAST'}); 
    }); 
}; 

私は誰かが

答えて

0

:-)私を助けることができると思いますので、ここで私が見つけた解決策: ソケットdocumentation「は、各ソケットが自動的にIDで識別される部屋に参加する」よりも言います。しかし、私はまだ理解していないいくつかの理由から、私は以下の方法(socketIdは、保存された検索し、MongoDBのにチェックされている)に放出するとき、何も起こらないために:

socket.broadcast.to(socketId).emit('blabla', msg); 

しかし、最終的に私はに手動でユーザーを参加しました次のように個人の部屋:

io.on('connection', (socket) => { 
    Users.findById(socket.decoded_token.sub, (err, user) => { 
     if (user) { 
     // create a room for every user 
     socket.join(user._id); 

     socket.on('exemple', (data) => functionExemple(data, io)); 
     ... 

、その後、私は(するtargetIdは、コレクション内のユーザーの_idである)このようなfunctionExempleで特定のユーザーに発することができる:

exports.functionExemple= (par, io) => { 
    returnEmit.to(targetId).emit('blabla', msg); 
}; 

私はそれが誰かを助けることを望む:-)

関連する問題