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

时间:2015-05-21 11:21:40

标签: 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);
  }
  });

一切正常,但是,我的问题是 - 如何告诉功能&#34;广播()&#34;使用局部变量wss而不必在函数调用中指定

exports.broadcast = function(msg) {

这可能吗?因为它有助于简化代码,就像在其他函数中一样,我将不得不为函数提供3,4或甚至更多的变量,而如果函数在同一个文件中,它只会使用1个变量,例如。 / p>

提前谢谢!

1 个答案:

答案 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...
    }
  };
};