Node.js Socket.io和module.exports不能一起工作。我该如何解决这个问题?

Node.js Socket.io和module.exports不能一起工作。我该如何解决这个问题?,node.js,express,socket.io,Node.js,Express,Socket.io,我正在学习Node.js。我刚找到关于module.exports的信息。在我看来,这是一种通过分离代码来帮助保持代码干净和可维护的方法。 我试了几个例子,效果很好。我通过调用该方法访问了console.log,它运行了另一个文件中的函数 我还学习了一些socket.io。我也让它发挥作用 我想分离代码,所以我将所有socket.io连接信息放在一个单独的文件中,并在主服务器文件上调用该方法 它不起作用。如果所有代码都在同一页上,那么一切都可以正常工作的唯一方法 这就是我所拥有的: app.js

我正在学习Node.js。我刚找到关于module.exports的信息。在我看来,这是一种通过分离代码来帮助保持代码干净和可维护的方法。 我试了几个例子,效果很好。我通过调用该方法访问了console.log,它运行了另一个文件中的函数

我还学习了一些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();
    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;
ioConnect.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();
    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)(服务器);并且没有定义Get服务器,所以我尝试了 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
/root/game/ioConnect2.js:5
io.on('连接',函数(套接字){
^
类型错误:对象函数服务器(srv、opts){
如果(!(服务器的此实例))返回新服务器(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);
此.adapter(opts.adapter | | adapter);
this.origins(opts.origins | |'*:*);
this.sockets=this.of('/');
如果(srv)此。附加(srv,选项);
}没有“打开”的方法
在Object.addScore[作为ioConnection](/root/game/ioConnect2.js:5:16)
在对象处。(/root/game/app:8:19)
在模块处编译(Module.js:456:26)
在Object.Module.\u extensions..js(Module.js:474:10)
在Module.load(Module.js:356:32)
在Function.Module.\u加载(Module.js:312:12)
位于Function.Module.runMain(Module.js:497:10)
启动时(node.js:119:16)
在node.js:906:3

如果我把代码放在一个文件中,一切都正常。有人能给我解释一下这里到底发生了什么,我需要做什么吗?

当你需要socket.io时,它会返回一个函数。在app.js中,你用一个参数调用了require/function,并将返回值存储在“io”中。到目前为止还不错。在ioConnect.js中,你正在存储乐趣而不是这样做,你应该把你在app.js中设置的io传递给你对ioConnect.js的需求返回的函数

app.js ioConnect.js
/root/socket/app.js:4 var ioConnect=require('./ioConnect.js')(io);^TypeError:object不是函数我收到一个错误,它指向require('./ioConnect.js')和(io)之间抱歉,我应该在发布之前测试代码,我没有注意到你在ioConnect.js中返回的内容。我已经修改了答案。这是一种可能的方法。现在,require ioConnect.js返回一个构造函数。构造函数将“io”对象作为参数,并返回一个具有addScore方法的对象。