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



我目前正在使用Node.JS创建一个应用程序,使用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.io变量,该变量已设置为在单独的sockets.js文件中使用,该文件可以通过主app.jsexpress.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和表达式在我的项目中经常出现,我已经开发了一个模板,使事情变得容易。我喜欢在套接字连接由于某种原因断开或者套接字连接无法建立的情况下设置故障转移功能。所以我创建了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

最后,从前端,我可以检查是否有套接字连接,如果有,我使用套接字发出"module-someFunction"。如果我没有套接字连接,前端将执行一个AJAX调用,而不是"/module/someFunction",这将访问服务器端的相同函数,因为我使用了套接字连接。

作为一个额外的好处,如果我需要利用服务器中的函数,我也可以这样做,因为函数是导出的。它看起来像这样:

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

最新更新