Socket.io 最佳编码实践

2024-05-25

我正在开发一个 Node.js 应用程序,它使用 Socket.io 来处理实时通信。我的代码充满了 On 和 Emit 函数。我也使用房间功能。我的应用程序如下所示:

   var server = require('http').Server();
    var io = require('socket.io')(server);
    io.on('connection', function(socket){
      socket.on('event1', function(data){"lots of socket and non-socket codes" });
      socket.on('event2', function(data){"lots of socket and non-socket codes" });
      socket.on('event3', function(data){"lots of socket and non-socket codes" });
      socket.on('disconnect', function(){"Some other code"});
    });
    server.listen(portNum); 

它工作正常,但这不是我理想的解决方案。 首先,在这种方法中,所有内容都在一个大文件中,而不是具有独立功能的较小文件中。

其次,这个应用程序的调试和维护非常困难,因为它有 1000 多行代码,非常混乱。

这是我的问题:

是否有开发企业级质量 Socke.io 应用程序的首选/最佳实践? 如果是,是否有任何大型开源 Socket.io 应用程序可以演示此方法或任何文章可以帮助我以更好的方式重构我的代码?


我认为首先将每个回调函数放入 io.on('connection') 中放入的不同函数中,也许也将它们放入不同的文件中(使用 module.exports),您将开始拥有更清晰的应用程序。

好吧,我会写给你我使用的一种可能性,我不知道这是否是 socket.io 宇宙中最好的模式,但我认为这很好。

在你的主文件(带有 io.onconnection 的文件)中,你可以有这样的东西(你不必使用命名空间,这只是一个例子):

var SocketEvent = require('./socketEvent');

io.of('/user').on('connection', function (socket) {

    SocketEvent.load_common_event(socket);
    SocketEvent.load_user_event(socket);

});

io.of('/operator').on('connection', function (socket) {

    SocketEvent.load_common_event(socket);
    SocketEvent.load_operator_event(socket);

});

在您加载的 socketEvent.js 中,您可以拥有以下内容:

exports.load_common_event = function(socket){
    socket.on('disconnect', function(){"Some other code"});
};

exports.load_user_event = function(socket){
    socket.on('event1', function(data){"lots of socket and non-socket codes" });
    socket.on('event2', function(data){"lots of socket and non-socket codes" });
    socket.on('event3', function(data){"lots of socket and non-socket codes" });
};

exports.load_operator_event = function(socket){
    socket.on('event4', function(data){"lots of socket and non-socket codes" });
    socket.on('event5', function(data){"lots of socket and non-socket codes" });
    socket.on('event6', function(data){"lots of socket and non-socket codes" });
};

如果您有任何疑问,请告诉我

Add-on

如果你想要类似 Socket.on('event' , myModule.doSomething); 的东西

我想你可以在模块中这样做:

client :

var myModule = require('./socketModule');

io.on('connection', function (socket) {

    socket.on('event' , myModule.doSomething(/*some parameters (socket)*/));

});

服务器socketModule.js:

exports.doSomething = function(/*some parameters (socket)*/){
    /* Some processing around */
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Socket.io 最佳编码实践 的相关文章

随机推荐

  • Java文本输出中的UTF-8编码问题

    我一直致力于测试高棉语 Unicode Wordbreaker 的各种解决方案 高棉语单词之间没有空格 这使得拼写检查和语法检查变得困难 以及从旧高棉语转换为高棉语 Unicode 我得到了一些源代码 现在在线 http www white
  • 泛型类上的 DebuggerDisplay

    我在应用时遇到问题DebuggerDisplay泛型类的属性 DebuggerDisplay foo class Foo DebuggerDisplay Bar t class Bar
  • 如何将空字符串序列化为单个空标签?

    我使用 Simple XML 框架序列化此类 Root public class HowToRenderEmptyTag Element required false private String nullString 我想得到
  • Python 柯里化任意数量的变量

    我正在尝试使用柯里化在 Python 中进行简单的函数添加 我找到了这个咖喱装饰器here https gist github com JulienPalard 021f1c7332507d6a494b def curry func def
  • dlopen 或 dlclose 未调用信号处理程序

    我在随机时间内收到分段错误 我注册了信号 但发生分段错误时未调用信号处理程序 include
  • 使用 java 中的准备好的语句插入自定义 SQL 类型

    我有一些自定义类型 它们基本上都是枚举 以下是它们的外观示例 CREATE TYPE card suit AS ENUM spades clubs hearts diamonds 我在 Java 中有一些准备好的语句 看起来像这样 Setu
  • jQuery 自动完成/Twitter Typeahead 填充多个字段

    我目前正在使用 TypeAhead Bootstrap 但很高兴使用 jQuery Autocomplete 来完成我需要的事情 我有 5 个输入字段 我还有一个结构如下的表 因此我将使用远程数据源 Classification Model
  • USB编程

    我想对微控制器 AVR 进行编程 以通过 USB 控制一些 LED 它只是出于对如何构建和编程 USB 设备的兴趣 有一些 AVR 微控制器支持 USB 协议 或者我可以自己在另一个微控制器中实现 USB 协议 但我想知道用什么来在计算机上
  • 自动 Photoshop 从文件插入文本

    我有一个多语言网站 需要自动执行从 csv 源更新 psd 文件中文本图层的过程 我知道由于宽度的变化 psp 中可能会出现故障 但无论如何 将文本放在文档中会有很大帮助 我有什么选择 EDIT Murmelschlurmel 有一个可行的
  • 如何使用startsWith过滤并获取每个对象键的值?

    我试图通过获取每个键来过滤对象checkpoint并输出其值 目前 我只能输出键而不是值 下面 我有一个简单的对象 我正在使用过滤器和startsWith 我怎样才能得到这些值呢 var data practicals 0 checkpoi
  • 这种 bash 文件名提取技术有何用途?

    我有一部分 bash 脚本正在获取不带扩展名的文件名 但我试图了解这里到底发生了什么 是做什么用的 有人可以详细说明 bash 在幕后做了什么吗 如何在一般基础上使用该技术 bin bash for src in tif do txt sr
  • Django - 如何从中间件修改模板上下文

    我正在创建一个 Django 中间件 它通过会话管理 购物车 我能够成功修改会话数据 如下所示 class ShoppingCartMiddleware def init self get response self get respons
  • 为什么变量不在循环外更新?

    无法弄清楚为什么结果中的第一个键是 abc 而不是我期望的 c 我使用的是Python 3 6 4 数据结构很奇怪 因为我删除了不相关的键和值 f replace ab r data abc 1 def 2 ghi 3 jkf 4 lmn
  • true 和布尔列表 f# 的长度

    直接使用递归 写一个函数truesAndLength bool list gt int int那 返回列表的长度 在该对的第一个组件中 以及列表的数量 列表中正确的元素 在第二个组件中 你的函数必须只迭代 遍历列表的元素一次 请勿使用 Li
  • 如何使 cx-oracle 将查询结果绑定到字典而不是元组?

    这是我的代码 我想找到一种方法将查询结果作为字典列表而不是元组列表返回 看起来 cx oracle 通过部分文档讨论 绑定 来支持这一点 虽然我不知道它是如何工作的 def connect dsn cx Oracle makedsn hos
  • TCP和UDP如何检测传输错误?

    我想知道这些协议如何检测数据传输过程中出现错误 谢谢 可能会发生不同的错误 数据包顺序不正确 数据包丢失 数据包内的数据损坏 幻像数据包 接收方收到从未发送过的数据包 UDP 仅提供一种克服数据损坏的机制 这是 IPv4 中的可选功能 在
  • Cocoa 应用程序未在 High Sierra 上加载视图或运行代码

    我在 Mac AppStore 上有一个应用程序 许多用户最近写信说它无法在 High Sierra 上运行 可能是 10 13 6 很难从中提取具体信息 我设法在朋友的设备上重现了该问题 但是我无法使用该设备通过 Xcode 等进行构建
  • dplyr 中每组的 cumsum

    我开始享受dplyr但我陷入了一个用例 我希望能够申请cumsum数据框中的每个组与包 但我似乎无法正确处理 对于演示数据框 我生成了以下数据 set seed 123 len 10 dates as Date 2014 01 01 1 l
  • Angular Service Worker 路线

    我已经使用 Angular Service Worker 构建了一个应用程序 除了路线之外 它在离线状态下运行良好 如果我转到基本网址 应用程序加载正常 但如果我在离线状态下转到任何其他路线 则会收到离线错误 我的 ngsw manifes
  • Socket.io 最佳编码实践

    我正在开发一个 Node js 应用程序 它使用 Socket io 来处理实时通信 我的代码充满了 On 和 Emit 函数 我也使用房间功能 我的应用程序如下所示 var server require http Server var i