【问题标题】:How to share socket instance over multiple files?如何在多个文件上共享套接字实例?
【发布时间】:2018-05-13 03:31:36
【问题描述】:

我想使用来自多个文件的套接字实例。我已经在 App.js 文件中编写了我的套接字连接代码。如下所示

var socketCode = require('../api/sockets/socketCode.js');

var io = require('socket.io')(server);
io.on('connection', function(socket) {
  socketCode(io, socket);
}

现在我的socketCode.js 文件看起来像关注

module.exports = (io, socket) => {
  test: function(data) {
    console.log("io", io, "\n", "socket", socket)
    return io;
  }
}

现在我想从另一个文件调用test 函数,比如说从user.js

我的user.js 看起来像:

var socketCode = require('../api/sockets/socketCode.js')();
console.log(socketCode.test);

目的是保持独立的套接字代码和控制器和其他代码。每当我想从控制器发出一些事件/消息时。我只想在socetCode.js 中调用函数,它应该发出套接字事件。

我如何从user.js 调用test 住在socketCode.js 文件中。它应该打印/记录io 对象。

我找不到任何合适的文件结构以及套接字。我正在使用 express js。

【问题讨论】:

  • 您没有表达您的实际问题/问题是什么?
  • 如何从users.js文件中调用test函数?

标签: javascript node.js websocket socket.io


【解决方案1】:

正如您已经知道如何创建在socketCode.js 中导出命名函数的模块:

module.exports = (io, socket) => {
  test: function(data) {
    console.log("io", io, "\n", "socket", socket)
    return io;
  }
}

您只需将此模块导入其他地方:

var io = "your io object";
var socket = "your socket object";
var socket = require('../api/sockets/socketCode.js')(io, socket);
socket.test();

快速解释:您正在导出一个具有函数作为属性的对象。因此,每个函数都可以被视为您导入对象的成员。

【讨论】:

  • 我试过了,还是不行。它会引发错误 test is not a function。我也尝试过socket.test,但也没有用。你写了var socket = require('../api/sockets/socketCode.js')(io, socket); 但假设我想在任何控制器文件中要求它。我不会在那里有iosocket 实例。
  • @MalikLakhani 对不起,您的模块需要两个参数(io 和 socket),您必须将它们传递给它。我更新了我的答案
  • 我想要的是当socketCode.js 命中意味着来自app.js 文件时应该存储io。所以当我从 app.js 文件中调用 socketCode 时。如果我在测试之外(直接在 module.exports 内)登录控制台,它会被打印出来。现在 io 实例也应该在测试函数中传播。当我调用测试函数时,它应该使用 io 对象。
  • 简而言之,假设我想从控制器、路由、模型中发出事件。我该怎么办?
  • 我不会在控制器和类似文件中包含这些参数。
【解决方案2】:

有一个使用 Typescript 语言的库可以帮助您缩短艰难而漫长的道路,称为 socket-controllers

【讨论】:

    猜你喜欢
    • 2011-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-06
    • 2011-07-25
    • 2015-03-18
    • 1970-01-01
    • 2011-03-14
    相关资源
    最近更新 更多