从控制器发出套接字 - 如何从控制器访问套接字服务器

时间:2015-04-20 19:21:20

标签: javascript node.js sockets socket.io

我试图在我的节点项目上使用套接字。这就是它基本上如何运作:

/
  |-> controllers/
  |  |-> home.js
  |-> app.js
  |-> sockets.js

/app.js

在app上,我调用sockets.js来启动套接字服务器:

var express         = require('express');
var sockets         = require('./sockets');

var app = module.exports = express();

var server = app.listen(config.PORT);
var io = sockets(server);

/sockets.js

在此文件中,我启动套接字服务器,然后返回io。

var socket          = require('socket.io');

module.exports = function(server) {
  var io = socket.listen(server);

  io.sockets.on('connection', function(socket) {
     // Here I can call every socket I want (if I have the socket_id) with this code : 
     var socket = io.to(socket_id);
     socket.emit('message', {});
  });

  return io;
};

问题

但现在,我想在家用控制器上检索我的io服务器并调用特定的套接字。我试过这样做:

/controller/home.js

var io  = require('../sockets.js');

module.exports = {
  home: function(req, res, next) {
    var socket = io.to(socket_id);
    socket.emit('message', {});
  }
};

但我有这个错误,因为我没有执行该功能(但我不想在这里创建一个新的套接字服务器):

TypeError: Object function (server) {
  var io = socket.listen(server);
  /*.....*/
  return io;
} has no method 'to'

我希望能够访问app.js上调用的此函数返回的io变量。我怎么能得到它?

2 个答案:

答案 0 :(得分:1)

您可以将sockets.js转换为公开io属性的对象。您还可以在初始化期间添加app.js调用的函数listen

// sockets.js

module.exports = {
    listen: function(server) {
        this.io = socket.listen(server);
        //...
        return this.io; 
    }
}

然后您的控制器可以访问require('../sockets.js').io,您只需要确保在使用时定义了io,或者确保app.js在您的控制器之前调用listen被调用。

答案 1 :(得分:0)

您必须将sockets.js转换为公开io属性的对象。 您还可以在初始化期间添加一个函数侦听app.js调用。

您的控制器可以访问require('../ sockets.js')。io。