亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

NodeJS + Socket.IO:訪問房間變量時出現問題

NodeJS + Socket.IO:訪問房間變量時出現問題

守候你守候我 2023-08-18 16:34:03
我是 NodeJS 和 Socket.io 技術的新手,我面臨著存儲在 io.sockets.adapter.rooms 中的變量的問題。我有我的 app.js :var app = require('express')();var http = require('http').createServer(app);var io = require('socket.io')(http);app.get('/', (req, res) => {  res.sendFile(__dirname + '/index.html');});io.on('connection', (socket) => {  console.log('a user connected');  socket.on('message', function (room) {      socket.join(room);      console.log(io.sockets.adapter.rooms);      io.sockets.adapter.rooms[room].variable = "This is a test";  })});http.listen(3000, () => {  console.log('listening on *:3000');});索引.html:<!DOCTYPE html><html><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>Document</title></head>    <input type="button" value="Press me" id="test"><body>    <script src="/socket.io/socket.io.js"></script>    <script>        var socket = io();        document.getElementById('test').addEventListener('click', function () {            socket.emit('message', 'room1');        })    </script></body></html>服務器返回此錯誤:TypeError: Cannot set property 'variable' of undefined這意味著“io.sockets.adapter.rooms[room].variable”未定義,但我不明白如何定義它。順便說一句,我正在使用 NodeJS 12.8.3 和express 4.17.1也許我需要一個特定的模塊?非常感謝所有花時間回答這個問題的人
查看完整描述

1 回答

?
海綿寶寶撒

TA貢獻1809條經驗 獲得超8個贊

在v3.0.0的變更日志中,他們提到以下
Socket#rooms 現在是一個 Set 而不是一個對象

這意味著它現在是一個Map 對象而不是普通的 js 對象

因此,在 v3.0.3 中,您在記錄房間時會得到以下輸出,您無法像普通 js 對象一樣通過鍵訪問房間,而必須使用 .set() 來代替。

Map(2) {

? 'II-OqYrpZYtv2bKrAAAD' => Set(1) { 'II-OqYrpZYtv2bKrAAAD' },

? 'room1' => Set(1) { 'II-OqYrpZYtv2bKrAAAD' }

}

雖然我不知道如何向房間添加額外的變量。因為如果您運行以下代碼:


io.sockets.adapter.rooms.set(room, {

? variable: "Test variable"

})

它用新變量替換套接字 ID。我找不到任何關于他們希望我們如何使用這種新結構存儲變量的信息。


Map(2) {

? 'Xv6vbxuOgDuqp6dmAAAB' => Set(1) { 'Xv6vbxuOgDuqp6dmAAAB' },

? 'room1' => { variable: 'Test variable' }

}

當使用 v2.0.3 記錄房間時,您會得到一個正常的對象輸出,您可以使用 [key] 訪問該輸出。


{

? 'tVnQpZyKDglSf4J-AAAA': Room { sockets: { 'tVnQpZyKDglSf4J-AAAA': true }, length: 1 },

? room1: Room { sockets: { 'tVnQpZyKDglSf4J-AAAA': true }, length: 1 }

}

因此,如果您將 socket.io 恢復到 v2.0.3(最新的 2.xx 版本),您的代碼可以正常工作。


您可以通過運行以下命令來恢復 socket.io


npm i [email protected]

或者通過更改package.json中的版本號然后運行


npm install


查看完整回答
反對 回復 2023-08-18
  • 1 回答
  • 0 關注
  • 111 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號