Socket.io和module.exports不能一起工作。我该如何解决?

时间:2015-02-02 22:30:37

标签: node.js express socket.io

我正在学习Node.js.我刚刚发现了module.exports。在我看来,这是一种通过分离代码来帮助保持代码清洁和可维护的方法。 我尝试了一些例子,但它确实有效。我通过调用方法得到了一些控制台。它运行了另一个文件上的函数。

我还学到了一些socket.io。我也得到了它的工作。

我想分开代码,因此我将所有socket.io连接信息放在一个单独的文件中,并在主服务器文件上调用该方法。

它不起作用。如果所有代码都在同一页面上,那么一切都有效。

这就是我所拥有的:

app.js

    var app = require('express')();
    var ioConnect = require('./ioConnect.js')
    var server = require('http').Server(app);
    var io = require('socket.io')(server);

    server.listen(80);

    ioConnect.ioConnection();

ioConnect.js

    function addScore() {

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

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

           socket.on('score', function(data) {
                socket.emit('addScore', 15);
            });

           });
     }



    module.exports.ioConnection = addScore;

起初我得到一个错误,上面写着:" io未定义"所以我补充道 var io = require(' socket.io)(服务器);并得到服务器没有定义所以我试过 var io = require(' socket.io');并得到了这个错误:

    /root/game/ioConnect2.js:5
                io.on('connection', function(socket) {
                   ^
    TypeError: Object function Server(srv, opts){
      if (!(this instanceof Server)) return new Server(srv, opts);
      if ('object' == typeof srv && !srv.listen) {
        opts = srv;
        srv = null;
      }
      opts = opts || {};
      this.nsps = {};
      this.path(opts.path || '/socket.io');
      this.serveClient(false !== opts.serveClient);
      this.adapter(opts.adapter || Adapter);
      this.origins(opts.origins || '*:*');
      this.sockets = this.of('/');
      if (srv) this.attach(srv, opts);
    } has no method 'on'
        at Object.addScore [as ioConnection] (/root/game/ioConnect2.js:5:16)
        at Object.<anonymous> (/root/game/app:8:19)
        at Module._compile (module.js:456:26)
        at Object.Module._extensions..js (module.js:474:10)
        at Module.load (module.js:356:32)
        at Function.Module._load (module.js:312:12)
        at Function.Module.runMain (module.js:497:10)
        at startup (node.js:119:16)
        at node.js:906:3

如果我将代码放在一个文件上,一切正常。有人可以向我解释一下这里发生了什么以及我需要做什么?

1 个答案:

答案 0 :(得分:2)

当你需要socket.io时,它会返回一个函数。在app.js中,您使用参数调用require / function并将返回值存储在&#39; io&#39;中。目前很好。在ioConnect.js中,您将函数本身存储在io中。您应该将app.js中设置的io传递给您的ioConnect.js要求返回的函数,而不是这样做。

app.js

 var app = require('express')();
 var server = require('http').Server(app);
 var io = require('socket.io')(server);
 var ioConnect = require('./ioConnect.js')(io);
 server.listen(80);

 ioConnect.addScore();

ioConnect.js

function ioConnection(io) {

    if (!(this instanceof ioConnection)) {
        return new ioConnection(io);
    }

    this.io = io;
}

ioConnection.prototype.addScore = function() {

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

        socket.on('score', function (data) {
            socket.emit('addScore', 15);
        });

    });
}

module.exports = ioConnection;
相关问题