node.js - Socket IO 套接字属性未保存
问题描述
我正在使用带有 SocketIO 的 NodeJS。当我在异步函数中分配属性时,像这样
socket.on(channel, (data) => {socket.username = "username" });
然后在其他地方使用这个属性。(在另一个 socket.on 回调函数中),我收到 socket.username 未定义的消息。
我也单独创建了一个 var 用户名,但结果是一样的。分配的值在外部函数中不可见。
感谢您的任何帮助。
解决方案
每个套接字连接都有自己的上下文。
如果您想在上下文之间共享数据 - 您必须将其保存在可全局访问的位置。
有很多方法可以实现它。
其中简单如下:
1)创建一个GlobalContext
包含以下内容的模块:
module.exports = new Map();
2)并像这样传递您的上下文变量:
const context = require('./GlobalContext');
socket.on(channel, (data) => {
context.set('username', "someone");
});
3)从外部访问它:
const context = require('./GlobalContext');
const username = context.get('username');
PS 请记住,在可以并行工作许多套接字 io 实例的容器化环境中,它必须以不同的方式完成。
我的示例适用于您已取消集群 1 个 socket.io 应用程序实例的情况。
推荐阅读
- r - 如何重命名在 r 中使用 str_detect 找到的列?
- python - Python Tkinter 和 Sqlite 出现操作错误,但我完全按照教程进行操作
- c# - C#问题中的斑马打印机批量打印
- nginx - 错误:getaddrinfo ENOTFOUND ingress-nginx.ingress-nginx-controller.svc.cluster.local
- django - 如何改进保存表单的方法
- php - 如何从在线共享点 url 获取文档 uri?
- omnet++ - 在 Omnet++ 中定义和获取/设置全局变量或类类型变量
- apache-flink - 多个 FlinkKinesisProducer 作为数据流的接收器
- python - 如何通过循环创建变量
- azure - 如何从 Azure 数据工厂中查找活动的输出中删除转义字符?