【发布时间】:2019-07-29 04:03:13
【问题描述】:
我渴望为 Websockets 和 net.Sockets 分配唯一的标识符,因此当收到消息时,客户端通过附加到套接字的标识符来标识。
以往的研究:
对于 Websocket:
const app = express();
const server = http.createServer(app);
const wss = new WebSocket.Server({ server });
wss.on('connection', (ws) => {
ws.id = uuid.v4(); // This is the relevant line of code
ws.on('message', (msg: string) => {
...
}
});
对于 net.Socket:
完全一样 - 根据this,需要以下内容:
var server = net.createServer();
server.on('connection', function(conn) {
conn.id = uuid.v4(); // This is the relevant line of code
conn.on('data', function(data) {
...
});
});
问题
编译期间错误“属性'id'不存在于类型'WebSocket'[或相应的'Socket']”。 This 解释了原因。
可选的解决方案 #1:投射到任意位置
更新 net.Socket 代码为:
var server = net.createServer();
server.on('connection', function(conn) {
(conn as any).id = uuid.v4();
conn.on('data', function(data) {
console.log('Session id:' + (conn as any).id);
});
});
问题:这对我来说似乎不是一个好习惯。除了现在的预感之外,我没有关于原因的参考资料。
可选解决方案 #2:使用局部变量 [似乎是更好的选择]
更新 net.Socket 代码为:
var server = net.createServer();
server.on('connection', function(conn) {
const id: string = uuid.v4();
conn.on('data', function(data) {
console.log('Session id:' + id);
});
});
经过一番体验,似乎可以正常使用了。
所以 - 问题:
- 在可选解决方案#2中:是否保证 id 变量在此范围内始终可用?换句话说:这个解决方案有效吗?对于 net.Socket 和 Websocket?还是我缺少什么?
- 一般情况:是否可以使用其他标识符(可能是 WebSocket 和 net.Socket 中的内置标识符)?
[Typescript 版本: 3.2.4]。
【问题讨论】:
-
对于 1,它是有效的解决方案,检查这个developer.mozilla.org/en-US/docs/Web/JavaScript/Closures
标签: node.js typescript sockets websocket