要么我对socket.io的工作原理有一个根本的误解(很可能),要么我只是发现了一些没人知道的bug(几乎不可能)。
我一直在尝试将express与Socket.io集成。在客户端,一切都运行良好:用户点击按钮,事件发出,每个人都很高兴。
但是,假设我想在呈现页面之前从express路由中发出此事件。事件似乎从未发出。从我所看到的所有问题来看,我应该能够简单地将我的“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);
//app/routs.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')
})
}
因此,在本例中,我希望能够进入/route,看到“hello from the route”,然后在发出“send”事件后将“waffles”记录到控制台。相反,我什么也得不到。
我试图通过app.set('socketio',io)传入“io”。但不管怎么样,什么都不管用。
我还尝试在没有io.on('connection')的情况下在路由中发出事件,并且只需执行以下操作
io.emit('send' ...)
或
io.sockets.emit('send' ...)
我对socket.io的工作原理有一个根本性的误解(很可能)
你是正确的,
这是socket-io的典型设置,请访问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')
在路由器中,通过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')
})
}