【发布时间】:2021-03-02 16:46:12
【问题描述】:
我是 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');
});
index.html :
<!DOCTYPE html>
<html lang="en">
<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
也许我需要一个特定的模块?
非常感谢所有愿意花时间回答这个问题的人
【问题讨论】:
-
在 socket.io 的某些版本(2.x 和更早版本)和某些配置中,
socket.join()是异步的,直到稍后您可以传递的可选回调为叫。因此,您可能正在尝试在房间创建之前访问它。我认为 socket.io 的绝对最新版本(版本 3.x)实际上已经使socket.join()同步,因此它会立即完成并且您的代码可以工作。 -
我有socket.io 3.0.3 版本,但是不工作,可能需要另一个模块?
标签: javascript node.js express sockets socket.io