我正在开发一个小项目 - node.js中的在线游戏,同时学习它。我从一个大的服务器文件server.js开始,我做了所有的http,https,套接字处理,但是,随着它开始增长,我想我应该将我的类和函数保存在其他文件中。现在我有一个文件functions.js,如下所示:
//functions.js
//broadcast message to all clients
exports.broadcast = function(msg, wss) {
wss.clients.forEach(function (client) {
client.send(msg);
});
}
来自server.js的感兴趣的摘录是这样的:
var wss = new WebSocketServer({server: secureServer});
wss.on("connection", function connection(ws) {
//a single websocket starts here
var thisSocket = new ClientSocket(ws);
ws.on("close", function close() {
//remove websocket from sockets, but wait 5 seconds to avoid refresh disconnects
for (var i = 0; i < clientSockets.length; i++) {
if (clientSockets[i].socket === ws) {
clientSockets.splice(i, 1);
break;
}
}
//only inform if disconnected user had username
if (typeof thisSocket.username != "undefined") {
var message = {};
message.type = "disconnected";
message.username = thisSocket.username;
functions.broadcast(JSON.stringify(message), wss);
}
});
一切正常,但是,我的问题是 - 如何告诉功能&#34;广播()&#34;使用局部变量wss而不必在函数调用中指定
exports.broadcast = function(msg) {
这可能吗?因为它有助于简化代码,就像在其他函数中一样,我将不得不为函数提供3,4或甚至更多的变量,而如果函数在同一个文件中,它只会使用1个变量,例如。 / p>
提前谢谢!
答案 0 :(得分:1)
您可以为functions.js
函数设置broadcast
构建器,如下所示:
//functions.js
//broadcast message to all clients
exports.getBroadcast = function(wss) {
return function(msg) {
wss.clients.forEach(function (client) {
client.send(msg);
});
};
};
然后在导入它的应用文件中:
var functions = require('./functions.js');
var broadcast = functions.getBroadcast(wss);
然后使用broadcast
加入wss
。
当然,如果functions.js
中包含多个需要wss
的函数,则可以在一次get
调用中定义它们。
重新评论:
我正在尝试这个:var functions = require(&#34; ./ functions.js&#34;)。getFunctions(wss,clientSockets,gameRooms); var broadcast = functions.broadcast; var broadcastNewClient = functions.broadcastNewClient; var dataOnJoin = functions.dataOnJoin;我收到错误&#34;未定义&#34;。
如果getFunctions
如下所示,那么该用法应该没问题:
exports.getFunctions = function(wss, clientSockets, gameRooms) {
return {
broadcast: function(msg) {
// ... implementation using `msg` and `wss`...
},
broadcastNewClient: function(/*...args...*/) {
// ... implementation...
},
dataOnJoin: function(/*...args...*/) {
// ... implementation...
}
};
};