Socket.io 子文件中和外部打开('连接)



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

我有一个express应用程序,想在子文件中使用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逻辑的文件中具有socket逻辑时,它们才有效。

非常感谢。

也许下面这样的东西可以解决你的问题?基本上,每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 */);
}
}

最新更新