猿问

NodeJS + Socket.IO:访问房间变量时出现问题

我是 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


也许我需要一个特定的模块?


非常感谢所有花时间回答这个问题的人


守候你守候我
浏览 94回答 1
1回答

海绵宝宝撒

在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.ionpm i socket.io@2.0.3或者通过更改package.json中的版本号然后运行npm install
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答