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

时间:2018-07-20 18:15:11

标签: javascript node.js websocket socket.io

我正试图能够从其他文件中调用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,即服务器js,我在这里处理每个传入的套接字,等等。这是我尝试过的两件事,但它们都导致相同的结果问题。

1 个答案:

答案 0 :(得分:3)

有许多不同的方案可以与其他模块共享中心变量(例如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) {  .. }

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();

在这里不必说,必须先致电.init(server),然后才能致电.getio()。这利用了node.js模块缓存系统的优势,因此每次调用require('./socket.js')时,它都会返回给您第一次加载的模块,因此您可以访问以前缓存的io实例。


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

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


还有其他一些方法可以做到:

从app.js导出

您必须注意使用此方案的循环依赖性,因为如果app.js执行require('./a.js')然后a.js确实需要('./app.js'), you can create a circular dependency which will fail. So, this model only works ifa。加载模块后(例如在模块构造函数中)js is doing a 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);
}
相关问题