首页 > 解决方案 > 子文件和外部的 Socket.io on('connect)

问题描述

我对 node.js 很陌生,不明白如何解决以下问题:

我有一个快速应用程序,想在子文件中使用 socket.io 来获得更小的代码块——我想将 socket.io 部分排除到一个名为 data.js 的文件中——从我在这里读到的内容来看,这是一种正确的方法在子文件上使用 io:

const express = require('express');
const app = express();
const http = require('http');
const server = http.createServer(app);
const io = require('socket.io')(server);
require('.data')(io);

// .... start server etc. below.

在 data.js 文件中我有:

const consola = require('consola');

module.exports = function (io) {
  io.on('connection', (socket) => {
    consola.success(`User connected - ${io.engine.clientsCount} online`);

    socket.on('disconnect', (socket) => {
    consola.success(`user disconnected :(`);
    });
  });
};

到目前为止有效。我可以访问 data.js 中的 io。现在我想在函数(io)之外发出一条消息。原因是我在 data.js 中有一个间隔来检查新数据。当它检测到新数据时,数据应该通过 socket.io 转发到连接的客户端。但我不想将时间间隔放在“连接”中,因为这会在用户加入时触发一个新的时间间隔。所以我想从data.js中的另一个函数发出......

有人可以请我指出正确的方向吗?我已经在这里找到了一些解决方案,但似乎它们只有在文件中包含带有 express 逻辑的套接字逻辑时才有效。

提前谢谢了。

标签: node.jssocket.io

解决方案


也许像下面这样的东西可以解决你的问题?基本上,您每 N 毫秒向所有套接字发出。

const consola = require('consola');

module.exports = function (io) {
  io.on('connection', (socket) => {
    consola.success(`User connected - ${io.engine.clientsCount} online`);

    socket.on('disconnect', (socket) => {
    consola.success(`user disconnected :(`);
    });
  });

  setInterval(() => {
      io.sockets.emit('hi', 'everyone');
  }, 5000 /* Your configurable time */);

};

我们可以将刷新率传递给模块函数,使其更具可配置性。

const consola = require('consola');

module.exports = function (io, timeout) {
  io.on('connection', (socket) => {
    consola.success(`User connected - ${io.engine.clientsCount} online`);

    socket.on('disconnect', (socket) => {
    consola.success(`user disconnected :(`);
    });
  });

  if (timeout && timeout > 500) { /* Ensuring we don't update more frequently than half a second */
      setInterval(() => {
          io.sockets.emit('hi', 'everyone');
      }, timeout/* Your configurable time */);
 }
};

如果由于某种原因您绝对需要将 io 移到函数范围之外 - 您可以这样做:

const consola = require('consola');
var socketIO;    
module.exports = function (io, timeout) {
    socketIO = io;
    configureTimeout(timeout);
    socketIO.on('connection', (socket) => {
        consola.success(`User connected - ${io.engine.clientsCount} online`);
        socket.on('disconnect', (socket) => {
           consola.success(`user disconnected :(`);
        });
    });
};

configureTimeout(timeout) {
    if (timeout && timeout > 500) { /* Ensuring we don't update more frequently than half a second */
        setInterval(() => {
            socketIO.sockets.emit('hi', 'everyone');
        }, timeout/* Your configurable time */);
    }
}

推荐阅读