繁体   English   中英

javascript node.js变量在模块之间共享

[英]javascript node.js variable share among modules

我是新手,正在寻找解决方案,如何通过引用在文件(模块)之间共享变量。 例如,我在这里是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(“ Search”,...)

...应该是一个功能

现在,如果使用封闭器

socket.on(“ Search”,()=> ...)

可以将Search.js导出为已修改的{users,waitingQueue}形式,但是需要覆盖用户和waitingQueue变量,但是不起作用。 我也需要紧密耦合地将这些变量共享给其他模块。

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

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

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

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可以在其他各种模块之间共享。

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

您可以使用redis客户端获取/设置值,这些值将存储在redis数据库中,然后可以从同一本地计算机(如db)或一组本地文件中的任何进程中的任何代码获取/设置这些值。远程机器(这就是为什么我稍后会提到扩展的原因...)

Redis可以进行基准测试 ,根据我的经验,与其他数据库解决方案相比,它的运行速度惊人。

使用起来非常简单: Redis数据类型和抽象简介

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

...还有更多...

我建议您安装数据库服务器和客户端,并尝试获取和设置一些值,我相信它将对将来有用。

额外原因:

它会为您的武器库提供更多力量

  • 它确实适合缩放(垂直和水平缩放)
  • socket.io-redisGitHub

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

  • socket.io-emitterGitHub

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

编辑我知道您想在代码之间共享变量,但是由于我看到您正在使用socket.io,因此您可能还希望在从属设备之间共享这些变量...

Socket.IO:在节点之间传递事件

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM