为了账号安全,请及时绑定邮箱和手机立即绑定

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 socket.io@2.0.3

或者通过更改package.json中的版本号然后运行


npm install


查看完整回答
反对 回复 2023-08-18
  • 1 回答
  • 0 关注
  • 93 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信