无法读取未定义套接字的属性"emit"



我正在使用socket.io构建一个项目。在运行时得到错误"0";TypeError:无法读取未定义的"的属性"emit";。

服务器代码如下:

server.js

const express = require('express')
const app = express()
const server = require('http').Server(app)
const io = require('socket.io')(server)
const { v4: uuidV4 } = require('uuid')
app.set('view engine', 'ejs')
app.use(express.static('public'))
app.get('/', (req, res) => {
res.redirect(`/${uuidV4()}`)
})
app.get('/:room', (req, res) => {
res.render('room', { roomId: req.params.room })
})
io.on('connection', socket => {
socket.on('join-room', (roomId, userId) => {
socket.join(roomId)
socket.to(roomId).broadcast.emit('user-connected', userId)
socket.on('disconnect', () => {
socket.to(roomId).broadcast.emit('user-disconnected', userId)
})
})
})
server.listen(3000)

有人能帮忙纠正这个错误吗?

您的套接字函数似乎是按错误的顺序编写的

试试这个:

socket.broadcast.to(roomId).emit('user-connected', userId)

这个:

socket.broadcast.to(roomId).emit('user-disconnected', userId)
  • 如果您收到这个错误,我假设您遵循的是视频教程如何使用WebRTC创建视频聊天应用程序
  • 在本教程中,Kyle使用socket.io版本2.0.3
  • 由于您可能使用的是'4.0.1'版本的套接字,因此您正面临问题。显然,在这个版本中,broadcast属性不再是available/已被删除,这就是您收到上述TypeError的原因
  • 也可以在io对象上调用'to()'方法,而不是在socket对象上调用

解决方案:

替换此:

socket.to(roomId).broadcast.emit('user-connected', userId)

有了这个:

io.to(roomId).emit('user-connected', userId);

欲了解更多信息,请参阅以下文档:Socket.io房间

最新更新