2017-08-21 117 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