node.js - 如何检查对象是否是 Node.js 中的 SocketIO.Socket 或 net.Socket 的实例?
问题描述
我通过net
导入使用通用套接字以及来自 socket.io 的套接字,并且我想创建一个根据传递的套接字类型不同工作的函数。
但是,两者的构造函数名称都只是“Socket”,所以我不能使用object.constructor.name
,并object instanceof SocketIO.Socket
抛出一个错误,说 SocketIO 没有定义。
例子:
const net = require('net');
const io = require('socket.io')(httpsServer);
function test(socket) {
if (socket instanceof net.Socket) // Do thing
else if (socket instanceof SocketIO.Socket) // Do other thing
}
我也尝试过使用io.Socket
,以及sIO.socket
with const sIO = require('socket.io')
。有什么方法可以通过类检查来完成这项工作,还是我需要做一些事情,比如检查特定于一种套接字的属性?
解决方案
我建议在测试存在哪些属性/方法时使用“duck typing” 。短语duck typing来自这样一个概念,即如果它像鸭子一样走路和说话,它一定是鸭子。
例如,要查看套接字是否为 socket.io 套接字,您可以查找 socket.io 特定的方法和属性,这些方法和属性不会出现在不同类型的套接字(例如net.socket
套接字)上。
假设这是服务器端代码,最容易查看它是否是 socket.io 套接字,如果不是,它必须是您的其他选择:
// look for any one of several socket.io-unique properties
function isSocketIO(socket) {
return !!(typeof socket.join === "function" || socket.rooms || socket.handshake);
}
推荐阅读
- ios - iOS UISplitViewController - 从紧凑布局更改为常规布局时如何恢复导航状态
- reactjs - 我在反应中遇到了环境变量
- iis - 重写 URL 以指向 IIS 中的另一个站点
- c# - 转换 DataRow 项目数组的特定元素?
- scikit-learn - Scikit-learn KNeighborsClassfier 自定义权重的形状是什么?
- android - 即使在 MediaScannerConnection.scanFile() 之后,存储在 getExternalFilesDir() 目录中的图像在电话库中也不可见
- visual-studio-code - VSCode 删除多行注释快捷方式
- r - 单独的列指示两个不同行中两个不同日期的结果
- flutter - flutter_inappwebview 动态 URL 变化
- javascript - 如何使用量角器从第一行获取数据