Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.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 在对象中动态存储对象_Javascript_Node.js - Fatal编程技术网

Javascript 在对象中动态存储对象

Javascript 在对象中动态存储对象,javascript,node.js,Javascript,Node.js,这个问题可能听起来很愚蠢或者有点太简单,但我真的被卡住了 我有一个node.js应用程序,需要存储客户端,以便能够将信息从特定客户端发送到特定的其他客户端 var clients = { }; var chat = io.of('/chat') .on('connection', function(socket) { socket .on('ehlo', function(data) { // mysql queries here etc to get

这个问题可能听起来很愚蠢或者有点太简单,但我真的被卡住了

我有一个node.js应用程序,需要存储客户端,以便能够将信息从特定客户端发送到特定的其他客户端

var clients = { };

var chat     = io.of('/chat')
.on('connection', function(socket) {
    socket
    .on('ehlo', function(data) {
        // mysql queries here etc to get client's data,
        // for example session_id, customer name, ...

        // got stuck here, need to save the socket in customers object like:
        clients.(customer + data.get_customer_id) = { socket: socket };
我以后需要能够从不同的范围访问此属性等

基本上,我不知道这些抽象方法如何实现:

clients.addClient({ id: 123, socket: socket});
然后通过以下方式找到它们:

x = clients.findById(123);
// x now should be { id: 123, socket: socket}

首先,您可以定义一个客户机模块

//clients.js
"use strict";

var clients = {
    _db: []
};

clients.findById = function(id){
    for(var i=0; i < this._db.length; i++){
        var client = this._db[i];
        if(client.id === id){
            return client;
        }
    }
    return null;
};

clients.addClient = function(client) {
    if(!this.findById(client.id)){
        this._db.push(client);
    }
};

module.exports = clients;
稍后在另一个模块中,您可以访问相同的数据结构:

//module2.js
var clients = require('./clients');
var client = clients.findById(id);

就这样,您可以从不同的上下文访问相同的数据结构。这里的要点是,所有模块将共享相同的
客户机
对象。

。。。。你想要一个数据库吗?如果按Id添加和查找所有你想要的,你可以做
var clients=Object.create(null);客户端[123]=套接字;/*新增客户*/;客户[123];/*返回套接字*/
注意这不是持久性的。@BenjaminGruenbaum不不,我只想要一个能够容纳客户端对象并返回由ID标识的客户端对象的对象。我很困惑,因为Javascript数组有类似于
find()
push()
的函数,但要使用
find()
之类的函数,我必须像每一个元素一样。不确定这是否好。这就是为什么我建议使用一个数据库,该数据库将对其进行索引。@BenjaminGruenbaum我只希望客户端在运行时保持,并在应用程序关闭时删除。我不想为每个发出的事件查询数据库。谢谢你,你的第二个评论给了我一个想法,还有Edwins的答案!我会在函数中使用
this.\u db.push()
this.\u db.find()
吗?当然,如果客户端数据库是一个数组,则可以使用push。我认为node.js数组没有定义find函数。但是你可以实现你自己的。看看我更新的答案。感谢更新,你能估计一下_db数组中有多少对象,findById方法会开始变慢吗?好吧,假设数组没有排序(正如我上面所做的),我认为这是一个线性搜索。这是一个
O(n)
算法。随着列表的增长,查找客户机所需的时间也随之增加。您可以通过使用哈希数据结构来改进,在这种情况下,您可以将查找时间减少到
O(1)
。您可以使用客户端id作为密钥。我把那个问题留给你。
//module2.js
var clients = require('./clients');
var client = clients.findById(id);