在多个模块中需要socket.io(相同的实例)

2024-03-08

我对如何在 Node.js 中请求和使用模块有点困惑。

我的场景如下:

我在一个文件中编写了一个完整的服务器,它使用 Socket.io 进行实时通信。

现在index.js变得相当大,我想将代码分成几个模块以使其更易于管理。

例如,我有一些功能可以向客户提供调查并获取他们的答案。我将所有这些函数放在一个单独的模块中,并在 index.js 中需要它。到目前为止效果很好。

我唯一关心的是,是否有另一种方法可以在模块内使用 SAME 套接字实例。

我当前的编码如下所示:

索引.js:

var express = require('express');
var app = express();
var server = require('http').createServer(app);
var io = require('socket.io')(server);
var Survey = require('./survey');

io.on('connection', function (client) {
    client.on('getCurrentQuestion', function (data) {
        Survey.getCurrentQuestion(parseInt(data.survey_id), client.id);
    });
});

server.listen(port, server_url, function () {
    Survey.init(io);
});

调查.js:

var io = null;

var Survey = {};

Survey.init = function(socketio) {
    io = socketio;
};

Survey.getCurrentQuestion = function(survey_id, socket_id) {
    var response = {
        status: "unknown",
        survey_id: survey_id
    };

    // [...] some code that processes everything

    // then uses Socket.io to push something back to the client
    io.sockets.in(socket_id).emit('getCurrentQuestion', response);
};

module.exports = Survey;

这样就可以了,但我不高兴通过io在所需模块的 init 函数内。

做到这一点的“正确方法”是什么?

If I require('socket.io')在调查模块内,它是否与中的实例相同index.js?

我什至会要求它,因为它需要server,这需要app,它创建于index.js?

我很困惑,希望有人可以帮助我。谢谢!


当您导入node.JS库时,您还可以传入对象。在您的情况下,index.js 文件应更改为以下内容:

//index.js
var express = require('express');
var app = express();
var server = require('http').createServer(app);
var io = require('socket.io')(server);
var Survey = require('./survey')(io);

然后只需更改 Survey.js 代码即可获取 io 对象:

//survey.js

module.exports = function (io) {
    var Survey = {};

    Survey.getCurrentQuestion = function(survey_id, socket_id) {
        var response = {
            status: "unknown",
            survey_id: survey_id
        };

        // [...] some code that processes everything

        // then uses Socket.io to push something back to the client
        io.sockets.in(socket_id).emit('getCurrentQuestion', response);
    };

    return Survey;
};

回答你的另一个问题:

If you require('socket.io')在 Survey 模块中,它将是与 index.js 不同的实例。

EDIT

如果你想要一种更现代的方法......你可以使用 ES6 格式并创建一个类来更好地做到这一点:

'ES6 index.js

import SurveyClass from './Survey';
import * as express from 'express';
let app = express();
let server = require('http').createServer(app);
let io = require('socket.io')(server);
let MySurveyClass= SurveyClass(io);
let myInstance = new MySurveyClass();

myInstance.getCurrentQuestion(5, "some-socket-id");

'ES6 survey.js
export default class Survey{

    constructor(io){
        this.io= io;
    };


    getCurrentQuestion(survey_id, socket_id) {
        var response = {
            status: "unknown",
            survey_id: survey_id
        };

        // [...] some code that processes everything

        // then uses Socket.io to push something back to the client
        this.io.sockets.in(socket_id).emit('getCurrentQuestion', response);
    };




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

在多个模块中需要socket.io(相同的实例) 的相关文章

随机推荐

  • Python 对新实例的交替引用

    这些天我一直在玩Python 我意识到Python如何将id 地址 分配给新实例 int和list 的一些有趣的方式 例如 如果我继续使用一个数字 或两个不同的数字 调用 id 函数 它会返回相同的结果 例如 gt gt gt id 123
  • 使用 JSON 键作为嵌套 JSON 中的属性

    我正在 python 2 7 中使用嵌套的类似 JSON 的数据结构 我与一些外国 perl 代码进行交换 我只是想以更Pythonic的方式 处理 这些列表和字典的嵌套结构 所以如果我有这样的结构 a x 4 y 2 3 a 55 b 6
  • 表格视图单元上的步进器(快速)

    我将步进器的出口和操作放入表格视图单元格中 并使用协议委托将其连接到表格视图 当我点击第一行中的步进器时 步进器值在第一行中正常显示 但它也出现在某个随机行中 如何解决这个问题 表格视图单元格 protocol ReviewCellDele
  • WPF 工具包数据网格 - 自定义选项卡

    我有一个包含 3 列的 WPF 工具包 DataGrid 只有第三列允许数据输入 前两列是静态的 文本描述 是否可以控制选项卡和导航 以便选项卡和上下左右按钮将忽略前两列并在第三列的范围内运行 您可以使用以下命令禁用前两列上的制表符IsTa
  • oracle FOR LOOP 不在 SYS_REFCURSOR 中迭代

    程序如下 打开游标 然后通过批量收集获取选择查询的输出 问题是所有 ID 都存储在批量收集中 但我无法使用批量收集变量作为输入来循环第二个选择查询 它只考虑第一个 ID 而不是全部 输出应该是 SYS REFCURSOR 请说明我在这里缺少
  • 使用layout/main.xml 文件将选项卡添加到Android 应用程序

    我从 Android 开始 想向现有应用程序添加选项卡 现在我只有一项活动 其布局是在 XML 文件中定义的 我现在想添加其他选项卡 我查了一下发现http developer android com resources tutorials
  • 如何让 Holo Light 主题在我的 Xamarin 应用程序中工作

    我正在尝试让我的应用程序使用 Holo Light 主题 我为 Holo 创建了一个自定义主题并将其放入 资源 values v11 Fsd Theme xml
  • 如何提取 docker 镜像的所有替代标签?

    我使用构建管道管理 gitlab 所有组件都封装在来自官方 gitlab 维护者的 docker 镜像中 每当我更新时 通常每周一次 我需要检查 gitlab gitlab runner helper 是否仍然适用于当前最新版本的 gitl
  • PhpMailer 不发送邮件 - TLS 错误?

    我在使用 phpmailer 发送电子邮件时遇到问题 发送电子邮件的代码是 mail User email protected cdn cgi l email protection mail Password My Password mai
  • 为什么 Chrome 需要 12 秒来更新图层树?

    我有一个相对不复杂的 ASP Net 应用程序 它偶尔会在层中显示一条警报消息 带有阴影 并带有一个按钮来消除通知 这段代码多年来一直运行良好 最近 我收到用户抱怨响应速度非常慢 他们的体验是页面完全没有响应 并且当他们单击 确定 按钮时很
  • 如果在某些输入之后使用 getline() 则不起作用[重复]

    这个问题在这里已经有答案了 可能的重复 需要有关 getline 的帮助 https stackoverflow com questions 1744665 need help with getline getline 不起作用 如果我在一
  • 为什么 var 在“foreach (var row in table.Rows)”中计算结果为 System.Object?

    当我输入这个foreach陈述 foreach var row in table Rows var 的工具提示说class System Object 我很困惑为什么不是class System Data DataRow 如果你想知道 是的
  • Java - 从 Jar 文件创建类

    是否可以从 jar 文件加载类 然后从中创建对象 注意 jar文件在程序编译时并不存在 而是用户后来添加的 并在用户启动程序时加载进来的 我的代码是这样的 用户有一个 jar 文件 里面只有一个已编译的 java 类 然后 用户将此 jar
  • 在javascript中悬停后更改背景颜色

    我需要在 Javascript 中更改悬停背景颜色 function changeColor color var block document getElementsByClassName kafelek for var i 0 i lt
  • 计算经过的“时间”,其中参考时间取决于一个因素

    我正在尝试计算数据框中的经过时间 其中经过时间的 开始 值取决于数据框中因子列的值 简单来说 我将把时间值视为数字而不是时间对象 我的问题是关于分割 应用 组合 而不是时间对象 我的数据框如下所示 df lt data frame id g
  • 更改悬停时选择列表选项的背景颜色

    是否可以更改悬停时选择列表选项的默认背景颜色 HTML
  • OpenCSV CSVWriter 不为空元素添加引号字符

    我有一个要求 我需要用引号字符包装所有元素 我正在使用 CSVWriter 来编写这些行 CSVWriter writer new CSVWriter new FileWriter rptFileName CSVWriter DEFAULT
  • gzip 引发溢出错误:大小不适合无符号整数

    环境 Windows Python 3 4 1 64位版本 我尝试使用 pickle 和 gzip 保存数据 就像这样 with gzip open filename rb as f pickle dump data f 不使用 gzip
  • 将 split 命令的输出写入单独的目录

    因此 我使用 split 命令将文件拆分为单独的行 并将它们保存到与我正在执行命令的当前目录不同的目录中 split l 1 d a 5 additional suffix txt file1 dat file toindex 所以我想将输
  • 在多个模块中需要socket.io(相同的实例)

    我对如何在 Node js 中请求和使用模块有点困惑 我的场景如下 我在一个文件中编写了一个完整的服务器 它使用 Socket io 进行实时通信 现在index js变得相当大 我想将代码分成几个模块以使其更易于管理 例如 我有一些功能可