将 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.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)
首先,您有一个循环 require()
循环,其中 app
和 www
都需要另一个。你不能那样做。其中一个 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);
而且,您应该使用 let
或 const
而不是 var
。在nodejs开发中没有理由再使用var
。
我在 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.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)
首先,您有一个循环 require()
循环,其中 app
和 www
都需要另一个。你不能那样做。其中一个 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);
而且,您应该使用 let
或 const
而不是 var
。在nodejs开发中没有理由再使用var
。