【问题标题】:javascript node.js variable share among modulesjavascript node.js 模块之间的变量共享
【发布时间】:2017-08-21 09:55:31
【问题描述】:

我是新手,正在寻找如何通过引用在文件(模块)之间共享变量的解决方案。例如,我的这里是 app.js

const users = {},
    waitingQueue = []
module.exports = function(io){
    io.on('connection', (socket)=>{
        users[socket.id] = socket
        socket.on("Search", (d, ack)=>{
            waitingQueue.push(socket)
            //  logic with waitingQueue
            //  logic with users {}
        })
        socket.on("otherEvent", (d, ack)=>{
                     //  logic with waitingQueue
                     //  logic with users {}
             })
    })
}

现在我想按模块划分它。现在是新的 app.js

const users = {},
    waitingQueue = []
const Search = require('./search')

module.exports = function(io){
    io.on('connection', (socket)=>{
        users[socket.id] = socket
        socket.on("Search", Search(users, waitingQueue))
    })
}

现在在不同的情况下我的麻烦

socket.on("搜索", ...)

...应该是一个函数

现在如果使用encloser

socket.on("搜索", ()=>...)

export modified{users, waitingQueue} 表单 Search.js 可以,但需要覆盖用户和 waitingQueue 变量但不起作用。 我也需要通过紧密耦合将这些变量共享给其他模块。

我也尝试了基于事件发射器的方法 Object.observe() 但无法解决问题。 任何人都可以帮我解决这个问题

【问题讨论】:

    标签: javascript node.js sockets module scope


    【解决方案1】:

    我会使用REDIS 来存储共享值。

    您可以使用redis client 获取/设置值,这些值将存储在 redis 数据库中 然后可以从同一本地机器(作为数据库)或一组远程机器(这就是为什么我稍后会提到缩放...)中的任何进程中的任何代码获取/设置这些值。

    Redis 可以是benchmarked,根据我的经验,与其他数据库解决方案相比,它的速度非常快。

    使用非常简单:An introduction to Redis data types and abstractions

    • 二进制安全字符串。
    • 列表:已排序的字符串元素的集合 按插入顺序。
    • 集合:唯一的、未排序的字符串元素的集合。
    • (排序集,类似于 Sets )
    • 哈希,它是由与值关联的字段组成的映射。字段和值都是字符串。这与
      非常相似 Ruby 或 Python 哈希。

    ...还有更多...

    我建议你安装数据库服务器和客户端,并尝试获取和设置一些值,我相信这将是对未来有用的知识。

    额外原因:

    它将为你的武器库提供更多力量

    • 它非常适合缩放目的(两者:垂直和 水平缩放)
    • socket.io-redis (GitHub)

    通过使用 socket.io-redis 适配器运行 socket.io,您可以运行 不同进程或服务器中的多个 socket.io 实例 都可以相互广播和发射事件。

    如果您需要从非 socket.io 向 socket.io 实例发送事件 进程

    编辑我知道你想在你的代码之间共享变量,但是因为我看到你正在使用 socket.io,你可能想在你的奴隶之间共享这些变量......

    Socket.IO : passing events between nodes

    【讨论】:

    • 这一切都很好,但这如何帮助跨模块共享数据? :/ 这两个中间件都与扩展 socket.io 相关(这不是问题)。
    • 通常在现实世界的应用程序中,您可能会有很多代码实例,然后您可能需要在实例之间共享值。我向您展示的是这种情况下的一个很好的数据库解决方案,而且价格不贵(对于这个用例)[如 mysql]
    • 这很好,但这不是问题所在。但是,实际上,如果您存储大量数据,随着时间的推移,Redis 会变得变得昂贵。 Redis 最适合瞬态数据,或者充其量是非关键数据,例如缓存。我不建议将其用作完整的后端存储(比较 MySQL 和 Redis 就像比较苹果和橘子)。
    • 是的,它是“模块间变量共享”的另一种方式,提供了关于它在现实生活中的有用程度的额外信息,但就像我在两种情况下声明的那样,我们正在谈论这个用例,它是一个 waitingQueu 和一些 userData,所以成本实际上是由操作决定的,这就是为什么我还提到基准测试 :)
    • 除了跨进程共享数据的能力(我重申这不是问题)之外,我认为像 Redis 这样的东西将是不必要的复杂化。 Redis 是基于内存的,如果目标是将数据保存在内存中并且 OP 不关心多个进程,那么使用 Redis 会带来什么好处?这是我最初的观点,你已经回答了没有真正被问到的问题,使用 Redis 肯定有好处,但这些都是 if, buts & 也许是因为没有上下文。
    【解决方案2】:

    好吧,我的假设是在现实世界中的应用程序 userswaitingQueue 将来自某种持久性存储,例如数据库,因此跨模块“共享”数据的概念将不是问题,因为您很可能直接从数据库中获取数据。

    但是,如果我确实有想要在不同模块之间共享的内存中“全局”数据,那么我很可能会将其移动到它自己的模块中,例如

    data.js

    module.exports = {
        users: {},
        waitingQueue: []
    }
    

    app.js

    const Search = require('../search');
    const data = require('./data');
    
    module.exports = io => {
        io.on('connection', (socket) => {
            data.users[socket.id] = socket;
            socket.on('Search', Search(data.users, data.waitingQueue));
        });
    }
    

    作为自己的模块,data.js 可以在其他各种模块之间共享。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 2011-04-24
      • 1970-01-01
      • 1970-01-01
      • 2015-05-16
      • 2015-09-21
      • 1970-01-01
      相关资源
      最近更新 更多