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

时间:2017-08-21 09:55:31

标签: javascript node.js sockets module scope

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

export modified {users,waitingQueue}表单Search.js没问题,但是需要覆盖用户& waitingQueue varibles但没有工作。 我需要通过紧密耦合将这些变量分享给其他模块。

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

2 个答案:

答案 0 :(得分:2)

嗯,我的推测是在一个真实世界的应用users& waitingQueue来自某种持久存储,例如数据库,所以"共享"的概念跨模块的数据不是问题,因为您最有可能直接从数据库中获取。

然而,如果我确实有内存"全球"我希望在不同模块之间共享数据,然后我很可能将其移入自己的模块,例如。

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

答案 1 :(得分:2)

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

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

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

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

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

......还有一些......

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

额外理由:

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

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

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

  • socket.io-emitter GitHub
  

如果需要从nonsocket.io向socket.io实例发出事件   过程

编辑我知道你想在代码之间共享变量,但是因为我看到你使用的是socket.io,你可能想要分享那些也与你的奴隶相关的变量......

Socket.IO : passing events between nodes