【问题标题】:ot.js error Cannot read property 'emit' of undefinedot.js 错误无法读取未定义的属性“发射”
【发布时间】:2021-08-14 12:17:17
【问题描述】:

我正在学习如何使用 SocketIO、CodeMirror 和 ot.js 创建协作代码编辑器

但是有这个错误,我不知道如何解决。 这是我的套接字服务器代码

const socketIO = require('socket.io')
const ot = require('ot')
const roomList = {}

module.exports = server => {
let str = 'just a test'

const io = socketIO(server)
io.on('connection', socket => {
    console.log(`${io.engine.clientsCount} connected clients`)

    socket.on('joinRoom', data => {
        if(!roomList[data.roomId]){
            const socketIOServer = new ot.EditorSocketIOServer(str, [], data.roomId, function() {
                cb(true)
            })
            roomList[data.roomId] = socketIOServer
        }
        roomList[data.roomId].addClient(socket)
        roomList[data.roomId].setName(socket, data.username)

        socket.room = data.roomId,
        socket.join(data.roomId)
    })

    socket.on('newMessage', data => {
        io.to(data.roomId).emit('newMessage', data)
    })

    socket.on('disconnect', () => {
        socket.leave(socket.room)
    })
})
}

这是错误

myprojectpath/node_modules/ot/lib/editor-socketio-server.js:33
.emit('doc', {
^

TypeError: Cannot read property 'emit' of undefined

感谢您的帮助

【问题讨论】:

    标签: javascript node.js socket.io


    【解决方案1】:

    查看ot 包的源代码,it assumes 似乎socket.join() 返回套接字本身。在 socket.io 2.x.x 之前是这种情况,但在 socket.io 3.0.0 中进行了更改。 join 函数现在返回 voidPromise,具体取决于使用的适配器。

    您要么需要创建一个 ot 包的分支并更新它(并且可能提出拉取请求),要么尝试将您的 socket.io 降级到 2.4.1 或更低版本。但是,这可能不是一个好主意,因为 socket.io 2.4.1 有 security disclosures,只能通过升级到 >=3.0.0 来修复。

    或者,我建议不要使用 ot 包,因为它已经 7 年没有更新了,它的 repository 声明他们正在为该项目寻找维护者。有替代的操作转换库on npm,其中一个可能适合您的需求。 CodeMirror 本身似乎也有一个用于协作编辑的包:https://codemirror.net/6/examples/collab/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多