gpt4 book ai didi

javascript - 如何使用 Node.js 在 JavaScript 模块文件之间使用事件处理程序?

转载 作者:数据小太阳 更新时间:2023-10-29 04:54:11 28 4
gpt4 key购买 nike

我目前正在使用 socket.io 来发出和监听客户端 JavaScript 文件和 Node.js 服务器文件之间的事件,但我希望能够发出和监听 Node 服务器和它的模块之间的事件。我的想法是它看起来像这样:

Node 服务器:

var module1 = require('./module1');

//Some code to launch and run the server

module1.emit('eventToModule');
module1.emit('moduleResponse', function(moduleVariable) {
//server action based on module response
}

模块文件:

var server = require('./server.js');

server.on('eventToModule', function() {
//module response to server request
}
server.emit('moduleResponse', moduleVariable);

这显然是一个简化版本,但我认为应该可以使用此功能。我需要将模块文件设置为第二个服务器吗?如果是这样,那会是什么样子?

我还尝试使用 var socket = io.connect('http://localhost:3000');(这是我用来允许客户端连接到 Node 服务器的代码)而不是 server 并让 module1 监听并发送到 socket 但这也不起作用。

第二次尝试(仍然无效):

服务器.js

//other requirements
var module1 = require('./module');
const EventEmitter = require('events');
var emitter = new EventEmitter();

io.on('connection', function(client) {
client.on('emitterTester', function() {
emitter.emit('toModule');
emitter.on('toServer', function() {
console.log("Emitter successful.");
});
});
});

module.exports = emitter;

模块.js

var server1 = require('./server');
const EventEmitter = require('events');
var emitter = new EventEmitter();

emitter.on('toModule', function() {
console.log("Emitter heard by module.");
emitter.emit('toServer');
});

module.exports = emitter;

此外,当我尝试使用 server1.on 时,我收到消息 server1.on is not a function

最佳答案

在 node.js 中, EventEmitter object如果您想创建一个具有事件监听器然后可以触发事件的对象,通常是您使用的。您可以使用 EventEmitter直接对象,或者您可以从它派生并创建您自己的对象,该对象具有所有 EventEmitter功能。

因此,如果您想创建一个其他模块可以监听事件的模块,您可以这样做:

// module1.js
// module that has events

// create EventEmitter object
var obj = new EventEmitter();

// export the EventEmitter object so others can use it
module.exports = obj;

// other code in the module that does something to trigger events
// this is just one example using a timer
setInterval(function() {
obj.emit("someEvent", someData);
}, 10 * 1000);

然后,您可以让另一个模块使用第一个模块并监听来自它的一些事件:

// module2.js
var m1 = require('module1.js');

// register event listener
m1.on("someEvent", function(data) {
// process data when someEvent occurs
});

这里的重点是:

  1. 如果你想要一个模块允许人们监听事件然后触发事件,你可能想要创建一个 EventEmitter对象。
  2. 分享EventEmitter对象,您将其分配给 module.exportsmodule.exports 的属性这样其他执行 require() 的代码您的模块可以访问 EventEmitter对象。
  3. 一旦调用代码得到 EventEmitter来自 require() 的对象, 然后它可以注册监听 .on() 的事件方法。
  4. 当原始模块或任何模块想要触发一个事件时,它可以使用.emit() 来实现。方法。

请记住,有时事件是一个很好的架构选择,但并非所有模块之间的通信都最适合事件。有时,只导出函数并允许一个模块调用另一个模块的函数是有意义的。因此,事件并不是模块相互通信的唯一方式。


您的问题似乎表明您将 socket.io 视为同一服务器进程中的两个模块进行通信的一种方式。虽然这样做可能是可行的,但这通常不是 socket.io 的使用方式。通常 socket.io(基于 TCP/IP)将用于两个独立进程之间的通信,在这些进程中,您无法进行直接函数调用或为进程中的事件注册处理程序。后两种方案通常更容易用于进程内的通信,而 socket.io 更通常用于同一台计算机上的进程之间或不同计算机上的进程之间的通信。

关于javascript - 如何使用 Node.js 在 JavaScript 模块文件之间使用事件处理程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37235021/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com