javascript - 套接字未定义,如果未定义则发送不发送
问题描述
您好,我编写了以下函数来获取某人的套接字;
var getSocket = function(persId){
var socketid = users[persId].socket;
if(io.sockets.connected[socketid]){
return io.sockets.connected[socketid];
}
}
它们像这样被发射;
getSocket(372).emit({ ... });
现在,如果用户在发送套接字之前断开连接,则会导致未定义的套接字错误,这可能会导致问题。
有没有办法通过修改函数(无需检查if getSocket(372)
)使其不抛出错误?它现在正在引起问题。
谢谢!
解决方案
你应该做的是使用socket.io
功能,它已经检查过了。
io.to(room).emit()
在连接时,只需将用户加入一个名为372
(我相信那是用户 ID)的房间,然后向它发出:
io.on('connection', socket => {
const room = 372; // Get user id somehow
socket.join(room);
});
// Somewhere
io.to(372).emit(..)
emit
回答您的具体问题,您可以使用nop方法返回一个对象。此外,您必须在访问之前检查用户是否存在.socket
。您可以使用解构来做到这一点。
const { socket: socketId } = users[persId] || {};
完整的功能应该是:
const getSocket = function(persId){
const { socket: socketId } = users[persId] || {};
if(socketId && io.sockets.connected[socketId]){
return io.sockets.connected[socketId];
}
return { emit: () => {} }
}
现在您不必进行检查,因为.emit
它将永远存在。
getSocket(23123213).emit(); // Will no throw if 23123213 doesn't exist
推荐阅读
- state - autofac聚合服务中如何通过属性名区分注册?
- jquery - 如果复选框为空并且所有输入框具有相同的名称,如何隐藏输入框
- mysql - mysql语法在本地出错,但在生产中没有
- javascript - 在 ExtJS 6 中将 ext.getCmp 转换为 up() 或 down() 不返回任何内容
- apache-spark-sql - 从 csv 文件的文件夹创建表时,不读取标题信息。如何指定文件夹中的哪个文件用于标题?
- caffe - 由多个 GPU 触发的 Segfault
- html - 如何在 Flask 中导入 html 模板?
- javascript - 添加 babel-cli 后,我的 react 项目无法启动 npm
- c# - 反序列化 shodan 数据
- python - 如何以 (name): (sentence)\n(name): 格式捕获文件中的所有句子