2017-06-03 77 views
1

我正在使用帶有角度的socket.io。它工作正常,但我的問題是,它發射到Chrome中打開的所有標籤。目前的工作流程是應用程序將在多個選項卡中打開以運行不同的模擬。當我按下按鈕(動作)時,它會更新所有打開的選項卡。但是,我想發射到特定的選項卡。我如何設計?我看着stackoverflow和github,但無法讓socket.id工作。Socket.io發送到特定客戶端的標籤

服務器代碼

app.use(function(req, res, next) { 
    var socketid = '' 
    socketio.sockets.on('connection', function(socket) { 
     socketid = socket.id 

     res.socketid = socketid 
      // 
    }); 
    res.socketio = socketio; 
    next(); 
}); 

    console.log('sockrt ' + res.socketid) 
    res.socketio.emit('pyr', output) //res.socketid is undefined 

更新

app.js

app.use(function(req, res, next) { 
    var socketid = '' 
    socketio.sockets.on('connection', function(socket) { 
     socketid = socket.id 

     res.socketid = socketid 
      // 
    }); 
    res.socketio = socketio; 
    next(); 
}); 

py.controller.js(API端點)

export function index(req, res) { 
     console.log('sockrt ' + res.socketid) 
     res.socketio.emit('pyr', output) 

    }; 

端點正在工作,並且socket.io正在工作,但是socket.id未定義。我只需要找出將連接隔離到瀏覽器選項卡的方法。

+1

你在哪裏測試你的res.socketid(即console.log語句位於何處)?有一個很好的機會,你正在訪問的外部(在套接字連接事件中)之外訪問它,甚至在它被設置之前訪問它,因此它的未定義 –

+0

正如大衛所說,因爲它的異步,socketid沒有被定義,如果它被獲取之後執行。 – WilomGfx

+0

@DavidTamrazov更新瞭解釋的代碼。 –

回答

0

好的,經過一些試驗和錯誤,我能夠解決這個問題。通過SO看,有基於Express和Socket之間共享快速會話的解決方案。雖然它的工作,我無法孤立個別標籤。我的使用案例是將其設置爲可跨瀏覽器在多個實例中使用的應用程序(將其視爲引用引擎)。下面的解決方案爲我工作。

服務器代碼

socketio.on('connection', function(socket) { 
    socket.address = `${socket.request.connection.remoteAddress}:${socket.request.connection.remotePort}`; 

    // USED TO SET THE SOCKET ID FOR THE REQUEST 
    socket.emit('initialize', socket.id) 


    socket.connectedAt = new Date(); 
} 

客戶端代碼
在角,我安裝一個初始化事件來存儲特定插座的ID爲標籤

this.socket.on('initialize', socketid => { 
     console.log(socketid) 
     this.socketid = socketid 
    }) 


當該請求是發送表達,我發送作爲標題的socketid

return this.$http({ 
    method: 'POST', 
    withCredentials: true, 
    host: '127.0.0.1', 
    data: sim_data, 
    port: 3000, 
    responseType: "arraybuffer", 
    headers: { 
     "X-socketid": this.socketid 
    }, 
    url: '/api/blah' 
}) 

服務器代碼
最後,當快遞過程中的POST或讓我發出的socketid從頭

// GET SOCKET ID FROM HEADER 
    var socket_id = req.headers['x-socketid'] 

    if (typeof socket_id !== 'undefined' && socket_id) { 
     var io = req.app.get('io') 
     io.sockets.connected[socket_id].emit('pyr', output) 
    } 

我的下一個步驟是將它與用戶授權整合。

相關問題