将 var 服务器传递给另一个 nodejs 模块

时间:2021-02-27 17:30:54

标签: node.js express socket.io

我在 node.js 中有一个基于 Express 的服务器。模块名称为 www:

    const http = require('http');
    var app = require('../app');
    server = http.createServer(app);
    server.listen(config.serverPort);
    module.exports = server;

在另一个模块中,我想定义一个 socket.io 连接。我无法将 var server 传递给另一个模块。我的错误是什么?如果我在一个脚本中运行代码,一切正常。所以看起来将 var server 传递给另一个模块时出现问题。

    var www = require('./www');
    var io = require('socket.io')(www.server, {
        cors: {
            origin: '*',
            methods: ["GET", "POST"]
        }
   });

io.on('connection', function(socket){
    console.log('a user connected: ' + socket.id);
    
    });

My failure looks like:

::ffff:192.168.178.11 - - [27/Feb/2021:17:24:53 +0000] "GET /socket.io/?EIO=4&transport=polling&t=NVaXOrG&b64=1 HTTP/1.1" - -

::ffff:192.168.178.11 - - [27/Feb/2021:17:24:58 +0000] "GET /socket.io/?EIO=4&transport=polling&t=NVaXQ3X&b64=1 HTTP/1.1" - -

::ffff:192.168.178.11 - - [27/Feb/2021:17:25:03 +0000] "GET /socket.io/?EIO=4&transport=polling&t=NVaXRHo&b64=1 HTTP/1.1" - -

::ffff:192.168.178.11 - - [27/Feb/2021:17:25:08 +0000] "GET /socket.io/?EIO=4&transport=polling&t=NVaXSW3&b64=1 HTTP/1.1" - -

很高兴得到一些帮助!谢谢。

2 个答案:

答案 0 :(得分:1)

首先,您有一个循环 require() 循环,其中 appwww 都需要对方。你不能那样做。其中一个 require() 调用只会返回 null 并导致错误。对于此类问题,通常的解决方案是将公共代码移动到第三个模块中,并将前两个 require() 中的每一个都放在第三个模块中以访问公共代码,而不需要彼此。

然后,您还需要修正您的导入以匹配您导出 server 的方式。

当你这样做时:

module.exports = server;

这意味着您应该在导入方面执行此操作:

const server = require('./www');
const io = require('socket.io')(server, { ... });

您不是在导出 .server 属性,而是将整个 module.exports 对象设为服务器对象本身。因此,当您 require() 该模块时,您将直接获得服务器对象,而不是具有 .server 属性的对象。


此外(与您询问的具体问题无关),您应该像这样在本地声明您的服务器对象,以免意外创建全局变量:

const server = http.createServer(app);

而且,您应该使用 letconst 而不是 var。在 nodejs 开发中没有理由再使用 var

答案 1 :(得分:0)

由于您通过 server 导出 module.exports,因此您可以在 require('./www') 时直接访问它。使用 www.server,您试图访问导出服务器的 server 属性,这就是它无法正常工作的原因。

const server = require('./www')
const io = require('socket.io')(server,
  cors: {
    origin: '*',
    methods: ['GET', 'POST']
  }
})

请检查 this 答案以了解 module.exportsexports 之间的区别。


顺便说一句,我建议将 server.listen 入口点移动到 index.js(或您选择的文件),它应该从 www.js

导入服务器
// www.js

const http = require('http');
const app = require('../app')
module.exports = http.createServer(app)

// index.js

const server = require('./www')
server.listen(process.env.PORT || 3000)