2017-06-22 93 views
0

要麼我對socket.io的工作原理有一個基本的誤解(很有可能),或者我只是發現了一些沒人知道的錯誤(幾乎不可能)。帶有Express的Socket.io,在快速路由中不能工作

我一直在嘗試將express與socket.io集成。在客戶端,一切工作正常:用戶點擊按鈕,事件發出,大家都很開心。

但是,假設我想在渲染頁面之前從快速路徑中發出此事件。事件似乎從未被髮射。從我看過的所有問題中,我應該能夠簡單地將我的「io」實例插入到我的應用程序中,然後從我的路線中訪問它。

所以這是我的設置...

// index.js

var app = express(); 
var port = process.env.PORT || 3700 

var io = require('socket.io').listen(app.listen(port)); 
io.on('connection', function (socket) { 
    console.log("Socket connected on port " + port) 

    socket.on('send', function (data) { 
     console.log("WAFFLES") 
    }); 
}); 
console.log('The magic happens on port ' + port); 

require('./app/routes.js')(app, io); 

//應用程序/ routes.js

module.exports = function(app, io){ 

    app.get('/', function(req, res){ 

    io.on('connection', function (socket) { 
     console.log("Hello from the route!") 
     socket.emit('send', {message: 'urdum'}) 
    }); 

    res.render('index') 
    }) 
} 
在這種情況下

所以,我想能夠進入/路由,發出「發送」事件後,請參閱「路由中的Hello」和「WAFFLES」登錄到控制檯。相反,我一無所獲。

我試過通過app.set('socketio',io)傳入「io」。但無論如何,沒有任何工作。

我也嘗試發射路徑內的事件,而不io.on( '連接'),並簡單地只是做

io.emit('send' ...) 

OR

io.sockets.emit('send' ...) 

回答

1

我有一個基本的誤解了socket.io的工作原理(極有可能)

你是對的,

這是插座-io的典型設置,通過req.app.get('socketio');

// app/routes.js 
module.exports = function(app, io){ 

    app.get('/', function(req, res){ 
    var socketio = req.app.get('socketio'); 

    socketio.emit('send', {message: 'urdum'}); 

    res.render('index') 
    }) 
} 
閱讀更多 https://socket.io/docs/

// index.js 

var express = require('express'); 
var socketio = require('socket.io'); 
var http = http = require('http'); 
var app = express(); 

// Attach Socket.io 
var server = http.createServer(app); 
var io = socketio.listen(server); 
app.set('socketio', io); // <-- bind socket to app 
app.set('server', server); // <-- optional 
io.on('connection', function (socket) { 
    console.log("Socket connected on port " + port); 
}); 
app.listen(3000); 
server.listen(3001) // <-- socket port 
// app.get('server').listen(3001); // <-- use server or app.get('server') 

在你的路由器,接入插座