【问题标题】:Node socket.io passing socket to other file节点 socket.io 将套接字传递给其他文件
【发布时间】:2015-10-06 02:56:17
【问题描述】:

我正在构建我的应用程序,为了简单起见,假设我有一个名为 app.js 的主文件和一个名为 Rooms.js 的文件,我想在其中拥有处理socket.io房间等的所有功能。

app.js 中加载我的模块:

var Rooms = require("./methods/Rooms")
Rooms.Rooms(io, socket);

/methods/Rooms.js

exports.Rooms = function(io, socket) {

  /* This function works as a "controller" to Rooms module */

    (... some code here ...)

    if (usersJoined == usersToStartGame) {
        startGame(roomid, io, socket)
    }
}

function startGame(roomid, io, socket) {
    io.to(roomid).emit('startGame')
    (... other stuff ...)

确实有效,但我觉得我做错了什么。

我真的需要在每次创建新函数时传递 iosocket 吗?没有更简单的方法吗?

【问题讨论】:

  • 为什么不传递一次 io 并将其保存在 Rooms.js 中的一个变量中(或者可能与您的应用程序的上下文共享一个更大的对象)?您还可以有一个工厂(或原型对象)来包装套接字(这就是我所做的)。
  • 在这种情况下socket 是什么?我以为是io,但通常socket 指的是单个连接。如果它是单个连接,则传递它可能是唯一的选择。另一方面,io 可以抽象为它自己的模块,在需要的地方得到需要。

标签: javascript node.js socket.io koa


【解决方案1】:

我找到了令我满意的更优雅的解决方案: 在 app.js 中(为了清楚起见,我将其重命名为 Server.js) 我添加到

var server = http.createServer(app.callback());
var io = socketio.listen(server);

以下内容:

exports.server = server
exports.io = io

然后进入io.sockets.on('connection', function(socket){ ... },我添加了exports.socket = socket

这让我可以在 /methods/Rooms.js 中使用 Server.js 模块:

var Server = require('../Server')

后来在这个文件中,我只需将socket.*io.* 语法更改为Server.socket.*Server.io.*

【讨论】:

    猜你喜欢
    • 2013-04-09
    • 2020-05-30
    • 2020-06-01
    • 2016-05-10
    • 2019-09-04
    • 2019-07-04
    • 1970-01-01
    • 2019-04-03
    • 1970-01-01
    相关资源
    最近更新 更多