在模块中使用express.js创buildSocket.IO服务器,并从其他模块访问它

我想要一个模块,我通过一个快速的应用程序创build一个服务器与Socket.IO。 在require调用之后,我想返回io对象。

这是我有:

ioserver.js

 var http = require("http"); module.exports = function (expressApp) { var server = http.createServer(expressApp); var io = require("socket.io")(server); return io; }; 

sample-request.js

 var io = require("./ioserver"); console.log("sample request io", io); 

index.js

 var express = require("express"); var app = express(); var io = require("./modules/ioserver")(app); console.log("index io", io); var sampleRequest = require("./modules/sample-request"); 

问题

index.js ,日志按预期返回io对象:

 index io Server { nsps: { '/': Namespace { name: '/', server: [Circular], sockets: {}, ... 

在示例模块中,日志看起来像:

 sample request io function (expressApp) { var server = http.createServer(expressApp); var io = require("socket.io")(server); return io; } 

为什么发生这种情况? 我想要的是从sample-request.js访问在index.js创build的io对象。 我注意到,如果我在示例模块中将parameter passing给require ,则会创build一个新的服务器,并且日志就是新的服务器。

问题可能是因为在一个地方,我require模块path./modules/ioserver和其他 – 与./ioserver ? 基于我读过的 。

我find了一个方法来做到这一点。 我不知道这是不是最好的方法,但它的工作原理。 如果有人有更好的解决scheme,请分享。

ioserver.js

 var http = require("http"); var io = null; module.exports = function (expressApp) { if (io === null && expressApp) { var server = http.createServer(expressApp); io = require("socket.io")(server); } return io; }; 

sample-request.js

 var io = require("./ioserver")(); 

index.js

 var express = require("express"); var app = express(); var io = require("./modules/ioserver")(app); var sampleRequest = require("./modules/sample-request"); 

请注意,在sample-request.js ,我调用 require()返回的对象:

 var io = require("./ioserver")(); ------------------------------^^ 

如果我不这样做,我会得到和我的问题一样的价值。