使用Express的Socket.io,在快速路线内发出不起作用

时间:2017-06-22 22:05:50

标签: node.js sockets 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);

// app / 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')
  })
}

所以在这种情况下,我希望能够进入/ route,参见"来自路线的你好"然后" WAFFLES"在发出"发送"之后登录到控制台事件。相反,我什么都没有。

我试图传入" io"通过app.set(' socketio',io)。但无论如何,没有任何作用。

我还尝试在没有io.on('连接')的情况下在路线中发布事件,只是做了

io.emit('send' ...)

OR

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

1 个答案:

答案 0 :(得分: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')
  })
}