首页 > 解决方案 > 如何检查对象是否是 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.socketwith const sIO = require('socket.io')。有什么方法可以通过类检查来完成这项工作,还是我需要做一些事情,比如检查特定于一种套接字的属性?

标签: node.jssocket.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);
}

推荐阅读