第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

設(shè)置 Socket.io 房間變量

設(shè)置 Socket.io 房間變量

我想在套接字空間變量中存儲(chǔ)一些信息,但出現(xiàn)以下錯(cuò)誤:UnhandledPromiseRejectionWarning: TypeError: Cannot set property 'host' of undefined這是我的代碼:io.on('connection', (socket, next) => {    socket.on('create game', async () => {        console.log('Creating game...');        socket.username = await generateUsername();        socket.roomId = generateId();        socket.join(socket.roomId);        io.sockets.adapter.rooms[socket.roomId].host = socket.username;        io.sockets.adapter.rooms[socket.roomId].isOpen = true;        io.sockets.adapter.rooms[socket.roomId].players = [socket.username];        console.log('Game created! ID: ', socket.roomId);    });}如果我嘗試記錄socket.roomId它會(huì)返回類(lèi)似rBAhx0. 當(dāng)我登錄時(shí)io.sockets.adapter.rooms,我得到以下信息:Map {  'PX_o3Di9sp_xsD6oAAAB' => Set { 'PX_o3Di9sp_xsD6oAAAB' },  'rBAhx0' => Set { 'PX_o3Di9sp_xsD6oAAAB' }}但是,當(dāng)我嘗試記錄 時(shí)io.sockets.adapter.rooms[socket.roomId],它返回undefined。我怎樣才能解決這個(gè)問(wèn)題?
查看完整描述

3 回答

?
HUWWW

TA貢獻(xiàn)1874條經(jīng)驗(yàn) 獲得超12個(gè)贊

Socket.io 在最新版本中進(jìn)行了一些重大更改,無(wú)法像以前一樣訪問(wèn)房間。它將很多對(duì)象和數(shù)組更改為映射和集合,您可以在您發(fā)布的日志中看到它。


Set對(duì)象是值的集合。您可以按插入順序迭代集合的元素。Set中的一個(gè)值只能出現(xiàn)一次;它在套裝系列中是獨(dú)一無(wú)二的。


該Map對(duì)象保存鍵值對(duì)并記住鍵的原始插入順序。任何值(對(duì)象和原始值)都可以用作鍵或值。


訪問(wèn)映射的屬性與訪問(wèn)普通對(duì)象的屬性的方式不同。例子:


const myMap = new Map();

myMap.set("foo", "bar");

console.log(myMap["foo"]) // undefined

console.log(myMap.get("foo")) // bar

同樣適用于集合,但是在您的情況下,特別查詢此集合可能是錯(cuò)誤的方法,因?yàn)榇思蟽H包含 id 的集合,而不是實(shí)際的房間對(duì)象。即使您要從 Set 中獲取值,您也無(wú)法訪問(wèn)它的屬性(主機(jī)、isOpen 和玩家),因?yàn)樗皇且粋€(gè)字符串。


恐怕 3.0 版本使得直接訪問(wèn)所有房間列表變得不可能了。然而,適配器現(xiàn)在有一個(gè)屬性socketRooms,可以用來(lái)代替它。


為了更容易地訪問(wèn)套接字的房間,您應(yīng)該像這樣訪問(wèn)它們:


io.sockets.adapter.socketRooms(socketId);

然而,這仍然只會(huì)返回一個(gè)字符串列表。


此問(wèn)題最簡(jiǎn)單的解決方案是在連接范圍之外創(chuàng)建一個(gè)外部變量。


const rooms = {};


io.on('connection', (socket, next) => {

    socket.on('create game', async () => {

        console.log('Creating game...');

        socket.username = await generateUsername();


        socket.roomId = generateId();


        socket.join(socket.roomId);


        if (!rooms[socket.roomId]) rooms[socket.roomId] = {};

        rooms[socket.roomId].host = socket.username;

        rooms[socket.roomId].isOpen = true;

        rooms[socket.roomId].players = [socket.username];


        console.log('Game created! ID: ', socket.roomId);

    });

}


查看完整回答
反對(duì) 回復(fù) 2023-11-02
?
慕田峪9158850

TA貢獻(xiàn)1794條經(jīng)驗(yàn) 獲得超7個(gè)贊

在從 Socket.io 更改ArrayMap. 一個(gè)簡(jiǎn)單的解決方案是改變:

    io.sockets.adapter.rooms[socket.roomId].host = socket.username;

到:

    io.sockets.adapter.get(socket.roomId).host = socket.username;


查看完整回答
反對(duì) 回復(fù) 2023-11-02
?
牛魔王的故事

TA貢獻(xiàn)1830條經(jīng)驗(yàn) 獲得超3個(gè)贊

正如您在自己的日志中看到的,io.sockets.adapter.rooms是一個(gè)Map對(duì)象(在socket.io的更高版本中),而不是一個(gè)普通對(duì)象。這意味著房間是通過(guò) 訪問(wèn)的.get(),而不是通過(guò)簡(jiǎn)單的索引(例如您正在使用的索引)訪問(wèn):

io.sockets.adapter.rooms[socket.roomId].host = socket.username;

這根本行不通,因?yàn)?code>socket.roomId地圖上沒(méi)有普通屬性。

如果你想獲取房間對(duì)象,你必須這樣做:

let roomObj = io.sockets.adapter.rooms.get(socket.roomId);
roomObj.host = socket.username;

在我看來(lái),我不會(huì)直接弄亂房間里的物體。我們已經(jīng)知道 socket.io 之前已經(jīng)改變了他們的設(shè)計(jì),將任何試圖使用它們的代碼渲染為損壞的并且需要重新設(shè)計(jì)。相反,我可能只是創(chuàng)建自己的數(shù)據(jù)結(jié)構(gòu),在其中存儲(chǔ)自己的數(shù)據(jù),然后我就不會(huì)依賴于 socket.io 如何改變其設(shè)計(jì)的突發(fā)奇想。直接訪問(wèn)房間對(duì)象不是socket.io 的承諾設(shè)計(jì)或承諾的API。他們可以隨時(shí)改變它的工作方式,而且最近確實(shí)已經(jīng)改變了它。


查看完整回答
反對(duì) 回復(fù) 2023-11-02
  • 3 回答
  • 0 關(guān)注
  • 258 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)