我在 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" - -
很高兴得到一些帮助!谢谢。
答案 0 :(得分:1)
首先,您有一个循环 require()
循环,其中 app
和 www
都需要对方。你不能那样做。其中一个 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);
而且,您应该使用 let
或 const
而不是 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.exports
与 exports
之间的区别。
顺便说一句,我建议将 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)