提问者:小点点

带有Express的Socket.IO,在Express路由内发射不工作


要么我对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' ...)

共1个答案

匿名用户

我对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')
  })
}