将对象动态存储在对象中

时间:2014-06-01 14:42:28

标签: 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 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}

1 个答案:

答案 0 :(得分:0)

好吧,您可以先定义一个客户端模块。

//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;

Node.js的工作方式将在模块初始化后对其进行缓存。这是你第一次使用它。这意味着每次需要它时,您将获得相同的clients对象。所以现在你可以在假设的module1.js中执行此操作:

//module1.js
var clients = require('./clients');
clients.addClient(newClient);

稍后在另一个模块中,您可以访问相同的数据结构:

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

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