我正在开发一个通过 socket.io 与服务器通信的应用程序,我的应用程序中的用户具有我想在我的服务器上使用的唯一 ID,所以我创建了一个包含具有这些唯一 ID 和套接字的字段的小类
import {Socket} from 'socket.io'
export interface VKClient{
vkid: string,
socket: Socket
}
export class VKClients{
clients: VKClient[] = []
addClient(client: VKClient){
this.clients.push(client)
}
sendToClient(id: string, message: string, data?: any){
this.clients.find(x => x.vkid === id)?.socket.emit(message)
}
}
所以在 index.ts 我有结构
const io = new Server(5000, {
cors: {
origin: '*'
}
})
const clients = new VKClients()
io.on('connection', (client) => onConnect(client, clients))
和 onConnect 处理程序看起来像
const onConnect = (client: Socket, clients: VKClients) => {
client.on('handshake', (data: {uid: string, salt: string}) => {
const newClient: VKClient = {vkid: data.uid, socket: client}
clients.addClient(newClient)
clients.sendToClient(data.uid, 'handshake')
})
client.on('getThemes', async (callback) => callback(await getThemes()))
}
问题是当客户端的用户发送握手消息时没有任何反应,服务器收到此消息,数据正常,它有 id 和哈希,套接字已添加到我的类中,我可以通过自定义 id 找到他,但是我无法使用 sendToClient 方法发送消息,从 socket.io 广播和 foreach 工作正常,如果我在 sendToClient 方法中使用 console.log 结构,它将记录 true
p.s。在类和 onConnect 处理程序中由 socket.io 操作的 id 是相同的
回答1
我存储客户端的逻辑似乎存在问题,因为当我将 this...find(x => x.vkid === id)...
替换为 forEach(x => {if(x.vkid === id)...}
时,它按预期工作