我正在做一个小项目——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);
}
});
一切正常,但是,我的问题是 - 如何告诉函数“broadcast()”使用局部变量 wss 而不必在函数调用中指定
exports.broadcast = function(msg) {
这可能吗?因为这将有助于大大简化代码,因为在其他函数中我必须为函数提供 3、4 甚至更多变量,而如果函数在同一个文件中,它只会使用 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
调用中定义它们.
回复你的评论:
I am trying this: var functions = require("./functions.js").getFunctions(wss, clientSockets, gameRooms); var broadcast = functions.broadcast; var broadcastNewClient = functions.broadcastNewClient; var dataOnJoin = functions.dataOnJoin; I get an error "undefined".
只要 getFunctions
看起来像这样,这种用法应该没问题:
exports.getFunctions = function(wss, clientSockets, gameRooms) {
return {
broadcast: function(msg) {
// ... implementation using `msg` and `wss`...
},
broadcastNewClient: function(/*...args...*/) {
// ... implementation...
},
dataOnJoin: function(/*...args...*/) {
// ... implementation...
}
};
};
关于javascript - node.js 在导入中使用局部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30372282/