将 var server 传递给另一个 nodejs 模块

passing var server to another nodejs module

我在 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" - -

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

由于您是通过 module.exports 导出 server,因此您可以在 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)

首先,您有一个循环 require() 循环,其中 appwww 都需要另一个。你不能那样做。其中一个 require() 调用只会 return 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