哪个是在socket.io?

时间:2015-05-07 19:59:07

标签: javascript node.js sockets socket.io

是否有"原型"连接到socket.io的所有套接字?

我想定义一些可用于每个连接套接字的函数。

目前我有:

io.sockets.on('connection', function(socket) {
  //Define properties and functions for socket
  socket.hello = function(){
    console.log("hello from "+socket.id);
  }

  socket.hello();
});

但我正在定义一个新的'每个套接字的hello函数。有套接字原型吗?所以我可以有类似的东西:

Socket.prototype.hello = function(){
  console.log("hello from "+socket.id);
}

io.sockets.on('connection', function(socket) {
  socket.hello();
});

2 个答案:

答案 0 :(得分:3)

虽然它似乎没有通过主require('socket.io')提供。

目前,您必须直接require() socket.js来引用它:

var Socket = require('socket.io/lib/socket');

Socket.prototype.hello = function () {
    console.log("hello from " + this.id);
};
  

注意:从prototype开始,您必须将该实例引用为thissocket变量尚不可用。

     

此外,就像反对修改原生类型的建议一样,Object的{​​{1}} - 只有一个prototype,因此可能会遇到多个模块碰撞试图定义同样的方法。

答案 1 :(得分:0)

使用打字稿向Socket添加功能

创建Extension.ts文件

const Socket = require('socket.io/lib/socket')

declare module 'socket.io' {
    interface Socket {
        getGameKey(this: typeof Socket): string
        getToken(this: typeof Socket): string
    }
}

function getGameKey(this: typeof Socket): string {
    return this.handshake.query.gameKey
}

function getToken(this: typeof Socket): string {
    return this.handshake.query.token
}

Socket.prototype.getGameKey = getGameKey;
Socket.prototype.getToken = getToken;

 

然后将扩展文件导入需要访问新添加的方法(即getToken和getGameKey)的位置

import './Extension'

io.on("connection", socket => {
    console.log("Game key "+socket.getGameKey())
    console.log("Token "+socket.getToken())
})