【问题标题】:Socket.io and module.exports are not working together. How do I fix this?Socket.io 和 module.exports 不能一起工作。我该如何解决?
【发布时间】:2015-04-02 00:09:51
【问题描述】:

我正在学习 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();

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 is not defined”所以​​我添加了 var io = require('socket.io)(server);并且没有定义服务器,所以我尝试了 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

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

【问题讨论】:

    标签: node.js express socket.io


    【解决方案1】:

    当你需要 socket.io 时,它会返回一个函数。在 app.js 中,您使用参数调用了该 require/function,并将返回值存储在“io”中。目前很好。在 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;
    

    【讨论】:

    • /root/socket/app.js:4 var ioConnect = require('./ioConnect.js')(io); ^ 类型错误:对象不是函数
    • 我得到一个错误,它指向 require('./ioConnect.js') 和 (io)
    • 抱歉,我应该在发布之前测试代码,但我没有注意到您在 ioConnect.js 中返回的内容。我已经修改了答案。这是一种可能的方法。现在要求 ioConnect.js 返回一个构造函数。构造函数将 'io' 对象作为参数,并返回一个具有 addScore 方法的对象。
    猜你喜欢
    • 1970-01-01
    • 2022-12-10
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 2019-12-26
    • 2020-12-27
    • 2021-06-26
    • 1970-01-01
    相关资源
    最近更新 更多