Javascript JS:Node.JS和Socket.io-全局和体系结构
亲爱的大家, 我和JS合作了几个星期,现在我需要一些澄清。我在这里也读了很多资料和问答,这就是我到目前为止学到的 下面的所有内容都与Node.js和Socket.io相关Javascript JS:Node.JS和Socket.io-全局和体系结构,javascript,node.js,sockets,socket.io,Javascript,Node.js,Sockets,Socket.io,亲爱的大家, 我和JS合作了几个星期,现在我需要一些澄清。我在这里也读了很多资料和问答,这就是我到目前为止学到的 下面的所有内容都与Node.js和Socket.io相关 在Node.js中使用globals“可以”,但不是最佳实践,术语是:不要这样做 对于套接字,每一次套接字调用都会处理所有内容,这意味着几乎没有上一次调用的内存。调用进入并得到服务,因此没有“保留”变量 好的,我建立了一些聊天的例子,多个用户-都得到广播服务,但没有私人消息,例如 很简单,也很好。但现在我被困在我的脑海里,
- 在Node.js中使用globals“可以”,但不是最佳实践,术语是:不要这样做李>
- 对于套接字,每一次套接字调用都会处理所有内容,这意味着几乎没有上一次调用的内存。调用进入并得到服务,因此没有“保留”变量
- 我需要按要求行事
- 类似于请求:“给所有名为BRIAN的用户”
function User(socket) {
this.Name;
this.socket = socket; }
2.
而不是全局地保存一个数组
users = [];
在newConnection上,创建一个新用户,传递其套接字并存储在数组中,以便使用
users.push(new User(socket));
3.
在一个Socket.io请求中,如果想要联系所有Brian,请执行以下操作
for (var i = 0; i < users.length; i++) {
if(user[i].Name == "BRIAN") {
// Emit to user[i].socket
}}
for(var i=0;i
但在尝试和出错、调试、谷歌搜索和阅读之后,显然这不是应该做的事情,不知何故,我找不到正确的方法来做,或者至少看/理解它。你能帮我,给我指出一个好的方向或提出一个最佳实践吗?那太棒了:-)
注意:
我不想将数据存储在DB中(这是下一步),我想动态工作
非常感谢您的投入
var users = {
_list : {}
};
users.create = function(data){
this._list[data.id] = data;
}
users.get = function(user_id){
return this._list[user_id];
};
users.getAll = function(){
return this._list;
};
module.exports = users;
Oliver首先,请不要将用户放入全局变量中,最好将其放入模块中,并在需要时在其他地方使用。您可以这样做:
var custom_namespace = io.of('/custom_namespace');
custom_namespace.on('connection', function(client_socket){
//assuming here is where you send data from frontend to server
client_socket.on('user_data', function(data){
//assuming you have sent a valid object with a parameter "name", let the client socket join the room
if(data != undefined){
client_socket.join(data.name); //here is the trick
}
});
});
users.js
var users = {
_list : {}
};
users.create = function(data){
this._list[data.id] = data;
}
users.get = function(user_id){
return this._list[user_id];
};
users.getAll = function(){
return this._list;
};
module.exports = users;
在您的实现中的某个地方
var users = require('users');
对于您希望发送给所有名为“BRIAN”的用户的问题,
我可以看出,你可以通过两种方式做到这一点
首先。
当用户连接到socketio服务器时,允许用户使用自己的名字加入socketio房间。
所以它看起来是这样的:
var custom_namespace = io.of('/custom_namespace');
custom_namespace.on('connection', function(client_socket){
//assuming here is where you send data from frontend to server
client_socket.on('user_data', function(data){
//assuming you have sent a valid object with a parameter "name", let the client socket join the room
if(data != undefined){
client_socket.join(data.name); //here is the trick
}
});
});
现在,如果你想发送给所有名为“BRIAN”的人,你可以这样做
io.of('/custom_namespace').broadcast.to('BRIAN').emit('some_event',some_data);
第二。
通过将数据保存在模块用户上并使用lodash库对其进行过滤
示例代码
var _lodash = require('lodash');
var Users = require('users');
var all_users = Users.getAll();
var socket_ids = [];
var users_with_name_brian = _lodash.filter(all_users, { name : "BRIAN" });
users_with_name_brian.forEach(function(user){
socket_ids.push(user.name);
});
现在,您可以在socketio中这样做,而不是每次迭代一个接一个地发出它
io.of('/custom_namespace').broadcast.to(socket_ids).emit('some_event',some_data);
这是你的链接
我希望这有帮助。哇,西奥!多谢各位。好!!这是有道理的,而且肯定会帮助我走得更远。好的:)谢谢,我会继续我的陪审团:——)很高兴帮助你,伙计