模块化node.js / socket.io / express应用程序的最佳方法

我正在使用Node.JS正确创build一个使用Express和Socket.io的应用程序。 随着时间的推移,处理一个文件变得越来越困难,我正在移动某些东西,我知道如何但是想知道如何做到这一点的最佳方法。

我有一个私人领域的构造类似于:

privateArea.js

 function privateArea(props) { this.id = props.id; this.name = props.name; this.users = []; } privateArea.prototype.addUser = function(socketId) { this.users.push(socketId); }; module.exports = privateArea; 

我想这也有访问的socket.iovariables设置为在一个单独的sockets.js文件中使用,可以通过主app.js和一个单独的文件express.js

所以我想要的结构如下:

 project | app.js - joins it all together | express.js - initialises and manages all express routing | privateArea.js - constructor for private areas - must be able to reference socket.io | sockets.js - initialises and manages all socket.io sockets and events 

任何帮助/例子将非常感激。

谢谢

我使用socket.io,并在我的项目中经常expression,并且开发了一个模板,使事情变得简单。 如果套接字连接由于某种原因而下降,或者无法build立套接字连接,我喜欢进行故障切换。 所以我创build了http通道以及套接字通道。 这是一个基本的模块模板:

 module.exports = function () { var exported = {}; var someFunction = function (done) { //.. code here..// if (typeof done === "function") { done(null, true); } }; // export the function exported.someFunction = someFunction; var apicalls = function (app) { app.get("/module/someFunction", function (req, res) { res.header("Content-Type", "application/json"); someFunction(function (err, response) { if (err) return res.send(JSON.stringify(err)); res.send(JSON.stringify(response)); }); }); }; exported.apicalls = apicalls; var socketcalls = function (io) { io.on("connection", function (socket) { socket.on('module-someFunction', function () { someFunction(function (err, response) { if (err) return socket.emit('module-someFunction', err); socket.emit('module-someFunction', response); }); }); }); }; exported.socketcalls = socketcalls; return exported; } 

所以要使用这个,我首先需要将模块包含在我的app.js文件中,如下所示:

 var mymod = require('./myModule.js'); 

然后我可以启用从HTTP和WebSocket这样的服务的访问:

 mymod.apicalls(app); // passing express to the module mymod.socketcalls(io); // passing socket.io to the module 

最后,从前端,我可以检查,如果我有一个套接字连接,如果是这样,我使用套接字发出“模块一些function”。 如果我没有套接字连接,前端将执行一个AJAX调用,而不是“/ module / someFunction”,这将在服务器端实现与我使用套接字连接相同的function。

作为一个额外的好处,如果我需要利用服务器内的function,我也可以做到这一点,因为该function是出口。 这看起来像这样:

 mymod.someFunction(function (err, response) { // ... handle result here ... // });