我正在尝试制作一款适用于房间,大厅等的游戏(想象一下聊天应用,除了附加支票/信息存储)。
让我们说,我有一个模块room.js
var EventEmitter = require('events');
class Room extends EventEmitter {
constructor (id, name) {
super();
this.id = id;
this.name = name;
this.users = [];
}
}
Room.prototype.addUser = function (user) {
if(this.users.indexOf(user) === -1) {
this.users.push(user);
this.emit('user_joined', user);
} else {
/* error handling */
}
};
module.exports = {
Room: Room,
byId: function (id) {
// where should I look up?
}
};
如何准确获取此对象(包含事件)?如何访问此对象发出的事件?
在单个节点实例中,我会做类似的事情:
var rooms = [];
var room = new Room(1234, 'test room');
room.on('user_joined', console.log);
rooms.push(room);
另外,我不太了解Redis实际上是如何帮助的(它是否取代了EventEmitter?)
问候。
编辑:也会接受PM2解决方案。
答案 0 :(得分:0)
您可以使用Redis中的频道替换它们,而不是在Node中处理房间。
当新客户想要加入房间时,NodeJS应用程序会返回该给定房间的ID(即通道名称),然后客户suscribes返回所选房间(您的客户直接连接到Redis。
您可以使用Redis Set来管理会议室列表。
在这种情况下,您不需要任何事件发射器,并且您的节点服务器是无状态的。
否则,这意味着Redis将在互联网上公开(假设您的游戏是公开的),因此您必须激活Redis authentication。此解决方案的一个主要问题是您必须将服务器密码提供给所有客户端,因此它绝对不安全。 此外,Redis的表演允许暴力攻击,因此不建议将其暴露在互联网上。这就是为什么我认为所有通信都应该通过Node实例,即使Redis被用作后端。
要解决此问题,您可以使用socket.io在Node和客户端之间打开套接字,并使Node实例(不是客户端)订阅Redis通道。当Redis发布消息时,通过套接字将其发送到客户端。并添加一层身份验证,以确保只有有效的客户端连接到给定的通道。
不需要事件发射器。这是Redis客户端,它将是一个事件发射器(就像在这个example based on ioRedis中)