ot.js 错误无法读取未定义的 属性 'emit'

ot.js error Cannot read property 'emit' of undefined

我正在学习如何使用 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

感谢您的帮助

查看 ot 包的源代码,似乎 it assumes that socket.join() returns the socket itself. This was the case up to socket.io 2.x.x, but was changed in socket.io 3.0.0join 函数现在 returns voidPromise,具体取决于所使用的适配器。

你要么需要创建一个 ot 包的分支并更新它(也许提出一个 pull request),要么尝试将你的 socket.io 降级到 2.4.1或以下。但是,这可能不是一个好主意,因为 socket.io 2.4.1 有 security disclosures,只能通过升级到 >=3.0.0.

来修复

或者,我建议不要使用 ot 包,因为它已经 7 年没有更新了,而且它的 repository states that they are looking for maintainers for the project. There are alternative operational transformation libraries on npm, and one of them may suit your needs. CodeMirror itself also appears to have a package for collaborative editing: https://codemirror.net/6/examples/collab/