2017-08-21 41 views
0

我是新手寻找解决方案如何通过引用在文件(模块)之间共享变量。一个例子我这里是app.jsjavascript node.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 {} 
      }) 
    }) 
} 

现在我想将其划分modulewise。现在新的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)) 
    }) 
} 
现在

在differenct情况下,我的麻烦

socket.on( “搜索”,...)

...应该是一个funtion

现在如果使用罩壳

所以cket.on( “搜索”,()=> ...)

出口修改{用户,waitingQueue}形式Search.js是确定的,但需要覆盖用户& waitingQueue可变因素而无法正常工作。 我需要将这些变量与其他模块紧密耦合在一起。

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

回答

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)); 
    }); 
} 

作为它自己的模块,​​然后可以在各种其它模块共享。

+0

完美的答案感谢@詹姆斯 – shivshankar

2

我会用REDIS来存储共享值。

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

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

这是很简单的使用方法:An introduction to Redis data types and abstractions

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

......以及一些更多...

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

额外的理由:

它会给youeven更多的权力,你的军火库

  • 其换算目的真的好(包括:垂直& 水平扩展)
  • socket.io -redisGitHub

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

  • socket.io - 发射极GitHub

如果你需要发出事件从non-socket.io 过程

socket.io实例

编辑我知道你想在你的代码之间共享变量,bu牛逼,因为我看到你正在使用socket.io,你可能想共享这些变量也进行的跨你的奴隶......

Socket.IO : passing events between nodes

+0

这一切都很好,但是这是如何帮助在模块间共享数据? :/这两个中间件都与缩放socket.io有关(这不是问题)。 – James

+0

通常在现实世界的应用程序中,您可能会有很多代码实例,您可能需要在实例之间共享值。我向你展示的是一个很好的数据库解决方案,不需要昂贵(对于这个用例)[像mysql] – EMX

+0

这很好,但它不是问题所在。但是,实际上,如果您存储大量数据,随着时间的推移,Redis将变得非常昂贵。 Redis最适合用于瞬态数据,或最好用于数据非关键数据,例如缓存。使用它作为完整的后端存储是我不推荐的(比较MySQL和Redis就像比较苹果和橙子)。 – James