node.js - 子文件和外部的 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 逻辑的套接字逻辑时才有效。
提前谢谢了。
解决方案
也许像下面这样的东西可以解决你的问题?基本上,您每 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 */);
}
}
推荐阅读
- c# - 使用名称和版本将 .NET 库发布到 Github 包
- twitter - Google 脚本/表格 - Twitter API 集成 POST 状态/更新 in_reply_to_status_id
- windows-terminal - 执行命令行 exe 时使用 Windows 终端代替 cmd
- python - 如何为每个 django 模型选择赋予不同的颜色
- javascript - 如果所有 id 都未定义,则将不同的 id 推送到数组并获取一个数组
- css - Eclipse WikiText:如何设置 CSS 进行预览?
- sql - 如何从sql中的日期返回两天?
- jquery - 在 iFrame 窗口中加载图像时显示引导微调器
- php - WooCommerce API 在每个请求上都给出 JSON 语法错误
- git - 如何重置 sshd_config 配置文件