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