无法读取未定义 socketio 的属性“emit”

时间:2021-03-31 16:44:36

标签: node.js socket.io webrtc serversocket

我正在使用 socket.io 构建一个项目。 运行时出现错误“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)

谁能帮忙纠正错误?

2 个答案:

答案 0 :(得分:1)

看来你的socket函数顺序写错了

试试这个:

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

还有这个:

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

答案 1 :(得分:0)

  • 如果您收到此错误,我假设您正在关注此 视频教程How To Create A Video Chat App With WebRTC
  • 在本教程中,Kyle 使用的是 socket.io 版本 2.0.3
  • 您遇到了问题,因为您可能使用的是套接字版本 '4.0.1'。 显然在这个版本中,broadcast 属性不再是 可用/已被删除,这就是您收到上述 TypeError 的原因。
  • 还要对 'to()' 对象而不是 io 对象调用 socket 方法。

解决方案:

替换这个:

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

有了这个:

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

有关更多信息,请参阅此文档:Socket.io rooms