我是新手在寻找解决方案如何通过引用在文件(模块)之间共享变量。例如,我的 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()但无法解决问题。 任何人帮我解决这个问题
答案 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适配器运行socket.io,您可以运行 不同进程或服务器中的多个socket.io实例 所有人都可以相互广播和发送事件。
如果需要从nonsocket.io向socket.io实例发出事件 过程
编辑我知道你想在代码之间共享变量,但是因为我看到你使用的是socket.io,你可能想要分享那些也与你的奴隶相关的变量......