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
Javascript JS:Node.JS和Socket.io-全局和体系结构_Javascript_Node.js_Sockets_Socket.io - Fatal编程技术网

Javascript 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“可以”,但不是最佳实践,术语是:不要这样做 对于套接字,每一次套接字调用都会处理所有内容,这意味着几乎没有上一次调用的内存。调用进入并得到服务,因此没有“保留”变量 好的,我建立了一些聊天的例子,多个用户-都得到广播服务,但没有私人消息,例如 很简单,也很好。但现在我被困在我的脑海里,

亲爱的大家,

我和JS合作了几个星期,现在我需要一些澄清。我在这里也读了很多资料和问答,这就是我到目前为止学到的

下面的所有内容都与Node.js和Socket.io相关

  • 在Node.js中使用globals“可以”,但不是最佳实践,术语是:不要这样做
  • 对于套接字,每一次套接字调用都会处理所有内容,这意味着几乎没有上一次调用的内存。调用进入并得到服务,因此没有“保留”变量
好的,我建立了一些聊天的例子,多个用户-都得到广播服务,但没有私人消息,例如

很简单,也很好。但现在我被困在我的脑海里,无法回过头来

让我们说:

  • 我需要按要求行事
  • 类似于请求:“给所有名为BRIAN的用户”
在我的脑海里,我想象着:

1. 自定义对象用户在Node.js上全局定义

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);
这是你的链接


我希望这有帮助。

哇,西奥!多谢各位。好!!这是有道理的,而且肯定会帮助我走得更远。好的:)谢谢,我会继续我的陪审团:——)很高兴帮助你,伙计