javascript - node.js 在导入中使用局部变量

标签 javascript node.js module

我正在做一个小项目——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/

相关文章:

javascript - 可以将 id 设置为 ng-model 并显示搜索结果中的文本/描述的 Angularjs 自动完成指令

javascript - 即使在 javascript 中保存了数据的副本,数据还是空的

node.js - 使用 ubuntu upstart 启动时,node js multer 文件上传不起作用

清零 vmalloc 区域时 Linux 崩溃

javascript - TypeScript - 将模块/命名空间附加到窗口

linux - 如何在内核模式(Linux)下从串口读取数据(字符)?

javascript - JQuery 输入表单不起作用

javascript - 修改Javascript中的对象

javascript - Node.js 无法请求 squarespace 站点?

javascript - 任何 Jqplot 图表的背景不透明度