gpt4 book ai didi

javascript - 在文件之间从 socket.io 共享服务器

转载 作者:行者123 更新时间:2023-11-30 11:16:11 25 4
gpt4 key购买 nike

我正在尝试从其他文件中调用 io。重点是,当用户进入房间或​​调用 io.sockets 等时,它不会更新。

server.js

var options = {
key: fs.readFileSync('./certs/file.key'),
cert: fs.readFileSync('./certs/file.crt'),
requestCert: false
};
var app = express();
var server = require('https').createServer(options, app);
var io = require('socket.io').listen(server); io.origins('*:*');
global.io = io;

io.on('connection', function(socket) { .. }

我也试过;

module.exports.io

然后从另一个文件

require('server.js').io

这也不起作用,我想在一个文件中运行我的服务器,该文件是服务器 js,我在这里处理每个传入的套接字等。这是我尝试过的两件事,但它们的结果相同问题。

最佳答案

有许多不同的方案可以与其他模块共享一个中心变量(比如你的 io 变量)。这样做到底有多大意义取决于整体架构、您希望模块如何恢复等等……但所有这些都使用导入和导出的某种组合来在模块之间共享数据而不使用 global .

在您的特定情况下,您可以做一些非常简单的事情:

server.js

const options = {
key: fs.readFileSync('./certs/file.key'),
cert: fs.readFileSync('./certs/file.crt'),
requestCert: false
};
const app = express();
const server = require('https').createServer(options, app);
const io = require('./socket.js').init(server);

io.on('connection', function(socket) { .. }

套接字.js

let io;
module.exports = {
init: function(server) {
// start socket.io server and cache io value
io = require('socket.io').listen(server); io.origins('*:*');
return io;
}
getio: function() {
// return previously cached value
if (!io) {
throw new Error("must call .init(server) before you can call .getio()");
}
return io;
}
}

在其他想要访问io的模块中

const io = require('./socket.js').getio();

不用说,在调用.getio() 之前必须先调用.init(server)。这利用了 node.js 模块缓存系统,因此每次调用 require('./socket.js') 时,它都会返回给您第一次加载的相同模块,因此您有访问先前缓存的 io 实例。


仅供引用,这称为“拉”模型,其中想要访问其他内容的模块使用 require() 语句来“拉”它想要的变量。

还有一个推送模块,模块的加载器在加载模块后通过调用该模块中的函数将数据推送到模块。


还有一些其他的方法:

从 app.js 导出

你必须注意这个方案的循环依赖,因为如果 app.js 做 require('./a.js') 然后 a.js 做require('./app.js'),你可以创建一个会失败的循环依赖。因此,此模型仅在a.js在模块加载后执行require('./app.js')` 时有效(就像在模块构造函数中一样)。

app.js

const options = {
key: fs.readFileSync('./certs/file.key'),
cert: fs.readFileSync('./certs/file.crt'),
requestCert: false
};
const app = express();
const server = require('https').createServer(options, app);
const io = require('socket.io').listen(server); io.origins('*:*');


io.on('connection', function(socket) { .. }

// exports some things we want to share
module.exports = {
io: io,
app: app
};

一些其他想要访问 io 的文件

 // module constructor
modules.exports = function() {
// can use io in here
const io = require('./app.js').io;
}

推送模型

在此模块中,您将 io 变量传递给加载其他模块时需要它的任何其他模块。

app.js

const options = {
key: fs.readFileSync('./certs/file.key'),
cert: fs.readFileSync('./certs/file.crt'),
requestCert: false
};
const app = express();
const server = require('https').createServer(options, app);
const io = require('socket.io').listen(server); io.origins('*:*');


io.on('connection', function(socket) { .. }

// load someotherfile.js and pass it the io variable
require('./someotherfile.js')(io);

一些其他想要访问 io 的文件

module.exports = function(io) {
// put whatever code for your module here
setInterval(function() {
io.emit(...);
}, 1000);
}

关于javascript - 在文件之间从 socket.io 共享服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51448297/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com