1

我正在使用 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.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

任何帮助/示例将不胜感激。

谢谢

4

1 回答 1

2

我在我的项目中经常使用 socket.io 和 express,并且我开发了一个让事情变得简单的模板。我喜欢进行故障转移,以防套接字连接由于某种原因断开,或者无法建立套接字连接。所以我创建了 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”。如果我没有套接字连接,则前端将对“/module/someFunction”进行 AJAX 调用,这将在服务器端访问与我使用套接字连接相同的函数。

作为额外的奖励,如果我需要在服务器中使用该功能,我也可以这样做,因为该功能已导出。看起来像这样:

mymod.someFunction(function (err, response) {
    // ... handle result here ... //
});
于 2014-08-19T14:55:11.697 回答