在模块中使用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")(); ------------------------------^^
如果我不这样做,我会得到和我的问题一样的价值。