Socket.io - 在node.js中的单独文件中侦听事件

时间:2014-05-14 11:37:01

标签: javascript node.js events socket.io

例如我的想法是:

File1.js

 io.sockets.on('connection', function (socket) {
      socket.on('file1Event', function () {
           //logic
      });
 });

File2.js

 io.sockets.on('connection', function (socket) {
      socket.on('file2Event', function () {
           //logic
      });
 });

这个代码对于节点服务器来说,我会遇到这个代码的问题吗?

4 个答案:

答案 0 :(得分:37)

不,只是使用相同的" io"对象

File1.js

exports = module.exports = function(io){
  io.sockets.on('connection', function (socket) {
    socket.on('file1Event', function () {
      console.log('file1Event triggered');
    });
  });
}

File2.js

exports = module.exports = function(io){
  io.sockets.on('connection', function (socket) {
    socket.on('file2Event', function () {
      console.log('file2Event triggered');
    });
  });
}

app.js

var app = require('http').createServer(handler)
  , io = require('socket.io').listen(app)
  , fs = require('fs')
  , file1 = require('./File1')(io)
  , file2 = require('./File2')(io)

app.listen(3000);

function handler (req, res) {
  fs.readFile(__dirname + '/index.html',
  function (err, data) {
    if (err) {
      res.writeHead(500);
      return res.end('Error loading index.html');
    }

    res.writeHead(200);
    res.end(data);
  });
}

的index.html

<script src="/socket.io/socket.io.js"></script>
<script>
  var socket = io.connect('http://localhost');
  socket.emit('file1Event');  // 'file1Event triggered' will be shown
  socket.emit('file2Event');  // 'file2Event triggered' will be shown
</script>

答案 1 :(得分:0)

请注意不要为每个文件生成新的连接事件。您应该使用相同的on('connection')事件,否则在导入10个文件后,将从节点MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 connection listeners added. Use emitter.setMaxListeners() to increase limit中收到此错误。

更好的方法是在主文件中执行以下操作:

io.on('connection', function (socket) {

  require('pathToSocketRoutesFile1')(socket);
  require('pathToSocketRoutesFile2')(socket);

  require('pathToSocketRoutesFileN')(socket);

  return io;

};

以及每个单独的文件中

module.exports = function(socket) {

  socket.on('eventName1', function() {
    //...
  });

  socket.on('eventName2', function() {
    //...
  });

};

答案 2 :(得分:0)

另一种选择是创建一个 rootSocket 来处理初始连接,然后将套接字传递给其他处理程序。

const rootSocket = (io) => {
    io.sockets.on('connection', (socket) => {
        authorization(socket);
        chat(socket);
    });
};
exports.default = rootSocket;

答案 3 :(得分:0)

rootSocket.js :

$app->options('/{routes:.+}', function ($request, $response, $args) {
    return $response;
});

$app->add(function ($req, $res, $next) {
    $response = $next($req, $res);
    return $response
            ->withHeader('Access-Control-Allow-Origin', '*')
            ->withHeader('Access-Control-Allow-Headers', 'X-Requested-With, Accept, Origin, Content-Type, Authorization')
            ->withHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, PATCH, OPTIONS');
});

index.js :

const rootSocket = (io) => {
    io.on('connection', (socket) => {
        console.log('New connection');
          // possibility to outsource events
         socket.on('myEvent', () => {
           console.log('myEvent triggered');
         });
    });
}
module.exports = rootSocket;