Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js JavaScript如何访问异步事件处理程序中的项目数据;插座.on";在TCP服务器中?_Javascript_Node.js - Fatal编程技术网

Node.js JavaScript如何访问异步事件处理程序中的项目数据;插座.on";在TCP服务器中?

Node.js JavaScript如何访问异步事件处理程序中的项目数据;插座.on";在TCP服务器中?,javascript,node.js,Javascript,Node.js,我正试图找到从事件处理程序中访问现有对象的正确策略,并想知道我在这里提出的绕过是否是一个好的选择 在下面的示例中,我有一个类来构建一个简单的TCPServer。在服务器创建之后,当一个新的tcpclient到达时,在“ConnectAction”函数中,我需要访问“devName”变量,以找到与之相关的服务器实例。因此,“DevName”不能是全局的,需要特定于我的TCPServer对象的当前实例化 ------ Extract from my code -------- // TCPs

我正试图找到从事件处理程序中访问现有对象的正确策略,并想知道我在这里提出的绕过是否是一个好的选择

在下面的示例中,我有一个类来构建一个简单的TCPServer。在服务器创建之后,当一个新的tcpclient到达时,在“ConnectAction”函数中,我需要访问“devName”变量,以找到与之相关的服务器实例。因此,“DevName”不能是全局的,需要特定于我的TCPServer对象的当前实例化

  ------ Extract from my code --------
  // TCPserver Object Class
  TcpServer = function (devName, port) {

  // event handler executed each time a new TCP client connect to the server
  ConnectAction = function (socket) {      
      // for ech new client we create a new device and store it within server object
      device = new TCPClient (devName, socket);
  };

  this.server = net.createServer(ConnectAction);
  this.server.listen(port);
  return this;
  }
  Server1 = new TcpServer ("My First Server", 8080):
  Server2 = new TcpServer ("My Second Server", 8081):
在我过去使用的其他脚本语言中,可以向事件处理程序添加额外的参数。但是在NODE.JS中,类似于server=net.createServer(ConnectAction SomeExtraHandler);不起作用

我发现的唯一绕过方法是利用在对象构造时传递的参数。 当事件处理程序代码嵌入到对象边界中时,如本例所示;然后,即使在TCPserver对象上下文之外调用了处理程序,“这不是定义的”,处理程序仍然可以利用在对象创建时传递的参数。在本例中为“devName”

我的问题:我的旁路安全吗?是否有更好的方法来解决此问题? 我的样本的完整代码可从以下网址获得:


如果有人有更好的策略,我会非常高兴地了解它。在我的实际应用程序中,我应该有十个左右不同的服务器实例,每个实例都连接了几百个客户端。这就引出了第二个问题,node.js中的对象编码方法是否支持负载

使用
devName
应该很好,因为您已经在这样做了。但是,如果出于某种原因希望或需要将
ConnectAction
函数移到
TcpServer
实现之外,您可以使用它来完成您要做的事情

文档中的相关位:

bind()还接受提供给目标的前导默认参数 调用绑定函数时的函数

在您的示例中,这意味着您可以创建一个绑定版本的
ConnectAction
,它已经将
devName
设置为其参数之一。它看起来像这样:

ConnectAction = function (devName, socket) {      
    // for ech new client we create a new device and store it within server object
    device = new TCPClient (devName, socket);
};

var boundConnectAction = ConnectAction.bind(undefined, devName)
this.server = net.createServer(boundConnectAction);
// event handler executed each time a new TCP client connect to the server
function ConnectAction(socket) {      
    // for ech new client we create a new device and store it within tcp server object
    this.tcp.device = new TCPClient (this.tco.devName, socket);
}
function TcpServer(devName, port) {
    this.devName = devName;
    this.server = net.createServer(ConnectAction);
    this.server.tcp = this;
    this.server.listen(port);
}
在该代码中,
boundConnectAction
仍将正常地从
createServer
调用(
boundConnectAction(socket)
),但由于它绑定到
ConnectAction
,并带有
devName
的默认参数,因此它将传递该调用,就像它是
ConnectAction(devName,socket)

注意:
bind()
的第一个参数用作绑定函数中的
这个
。由于
ConnectAction
看起来不像是一个对象/类实例方法,所以我只传递了
undefined
,但您可能希望传递其他内容,具体取决于您的用例


至于您关于节点处理负载的另一个问题,我建议将大约10个服务器实例拆分为单独的节点进程,以便更好地分配负载。看一看,或者可能帮助解决这个问题

我的问题:我的旁路安全吗

是的,完全安全。使用javascript是解决这个问题的方法,您不需要显式地传递额外的参数

但是请注意,
ConnectAction
ListenAction
device
不应是全局变量,它们是特定于实例的,最好也限定在构造函数的范围内;否则,它们可能会干扰其他tcp服务器

有没有更好的方法来解决这个问题

有一种不同的方法,尽管未必更好:将
devName
作为对象的属性。
connectAction
是在您的服务器上下文中调用的,因此您可以在那里简单地访问它-如果您的
TcpServer
将从
net.server
继承,则至少是这样。由于服务器周围有一个包装器,因此可以执行以下操作:

ConnectAction = function (devName, socket) {      
    // for ech new client we create a new device and store it within server object
    device = new TCPClient (devName, socket);
};

var boundConnectAction = ConnectAction.bind(undefined, devName)
this.server = net.createServer(boundConnectAction);
// event handler executed each time a new TCP client connect to the server
function ConnectAction(socket) {      
    // for ech new client we create a new device and store it within tcp server object
    this.tcp.device = new TCPClient (this.tco.devName, socket);
}
function TcpServer(devName, port) {
    this.devName = devName;
    this.server = net.createServer(ConnectAction);
    this.server.tcp = this;
    this.server.listen(port);
}

为什么不能在
ConnectAction
内部使用
devName
ConnectAction
函数可以访问包含
devName
的父作用域。另外,
返回此
是不必要的。如果您有多个TcpServer实例可以访问父作用域是不够的。不要用短语
[solved]
标记您的问题标题,只是Bergi:非常好,我想事件处理程序在任何对象上下文之外,但事实上,它们是服务器上下文的附件,这是一个非常好的消息。我测试了你的建议,效果很好。谢谢你迈克:这正是我想要的。我测试了你的建议,我确认它非常有效。也就是说,Bergi刚刚提出的解决方案从对象方法的角度来看更干净。非常感谢。