有很多有趣的答案可以完成这项工作,但它们大多数似乎不太干净,也就是说,如果您不介意突变ws对象。我这样做是因为我正在使用TypeScript,而您不能随意向对象添加属性。
import WebSocket from 'ws'
declare module 'ws' {
interface WebSocket {
id: any
key: string
}
}
id不需要是任何类型,可以是数字或字符串,具体取决于您如何标识连接。我还没有完善系统,但暂时当建立连接时,我只分配一个随机数。
const socketConnection = (socket: WebSocket.WebSocket): void => {
socket.id = Math.random()
console.log(socket.id)
const msg = JSON.stringify({ res: `[open] Welcome to the WebSocket server!` })
socket.send(msg)
}
这可以在任何时候进行修改,因此一旦我验证连接,我计划在此处分配一个相关的ID,并且如果我想要做更多花哨的事情,甚至可能添加一个关键属性。
这是在文档的模块增强部分中解释的。
TypeScript: 模块增强
您可以通过查看onmessage事件中的多个消息来检查它是否仍然被分配。
const socketMessage = (socket: WebSocket.WebSocket): void => {
socket.on('message', async (message: WebSocket.RawData) => {
console.log(socket.id)
console.log(socket.key)
})
}
顺便提一下,我在设置套接字的文档中进行了此模块声明。但是修改会在文档之间传播。例如,在我开始原型化的AuthController中,我就是这样使用它的。
export default class AuthController {
public static connections: DLinkedList = new DLinkedList()
static async validate(request: { id: string, socket: WebSocket.WebSocket }): Promise<void> {
console.log('test', request.socket.id)
this.connections.add(request.socket, request.id)
request.socket.send(JSON.stringify({ res: true }))
console.log(this.connections.size())
}
static getSocket(id: string): WebSocket.WebSocket {
return this.connections.getAtKey(id).data
}
static removeSocket(socket: WebSocket.WebSocket) {
}
}
你也可以通过直接修改WebSocket对象原型来在纯JS中实现这一点。这里的一些答案谈到了它。我自己没有做过,但原理是类似的。
如何在typescript中为现有类添加方法?
希望这对你有用。
connections[username] = ws
),然后在其他地方,您可以执行类似于connections[username].send(message)
的操作。 - lanzzjoin()
和broadcast()
方法。在这里查看一些讨论:https://dev59.com/nGw15IYBdhLWcg3wFHpZ - meetamit