如何将socket.io导出到nodejs中的其他模块?

hus*_*ain 20 javascript node.js socket.io

我有socket.io工作,app.js但当我试图从其他模块调用它不创造io.connection不确定?

app.js

var express = require('express');
var app = express();
var server = require('http').createServer(app);
var io = require('socket.io')(server);
var ditconsumer = require('./app/consumers/ditconsumer');
ditconsumer.start(io);
server.listen(3000, function () {
    console.log('Example app listening on port 3000!');
});
Run Code Online (Sandbox Code Playgroud)

consumer.js

module.exports = {
    start: function (io) {
        consumer.on('message', function (message) {
            logger.log('info', message.value);
            io.on('connection', function (socket) {
                socket.on('message', function(message) {
                    socket.emit('ditConsumer',message.value);
                    console.log('from console',message.value);
                });
            });
        });
}
}
Run Code Online (Sandbox Code Playgroud)

jfr*_*d00 36

由于app.js通常是应用程序中的主要初始化模块,它通常会初始化Web服务器和socket.io,并将加载应用程序所需的其他内容.

因此,io与其他模块共享的典型方法是将它们传递给该模块的构造函数中的其他模块.这将是这样的:

var server = require('http').createServer(app);
var io = require('socket.io')(server);

// load consumer.js and pass it the socket.io object
require('./consumer.js)(io);

// other app.js code follows
Run Code Online (Sandbox Code Playgroud)

然后,在consumer.js中:

// define constructor function that gets `io` send to it
module.exports = function(io) {
    io.on('connection', function(socket) {
        socket.on('message', function(message) {
            logger.log('info',message.value);
            socket.emit('ditConsumer',message.value);
            console.log('from console',message.value);
        });
    });
};
Run Code Online (Sandbox Code Playgroud)

或者,如果您想使用.start()方法初始化事物,您可以使用相同的方法(次要差异):

// app.js
var server = require('http').createServer(app);
var io = require('socket.io')(server);

// load consumer.js and pass it the socket.io object
var consumer = require('./consumer.js);
consumer.start(io);

// other app.js code follows
Run Code Online (Sandbox Code Playgroud)

和consumer.js中的start方法

// consumer.js
// define start method that gets `io` send to it
module.exports = {
    start: function(io) {
        io.on('connection', function(socket) {
            socket.on('message', function(message) {
                logger.log('info',message.value);
                socket.emit('ditConsumer',message.value);
                console.log('from console',message.value);
            });
        });
    };
}
Run Code Online (Sandbox Code Playgroud)

这就是所谓的资源共享"推送"模块.正在加载的模块通过在构造函数中传递它来向您推送一些共享信息.

还有"拉"模型,其中模块本身在一些其他模块中调用方法来检索共享信息(在这种情况下是io对象).

通常情况下,任何一种模型都可以工作,但考虑到如何加载模块以及谁拥有所需信息以及您希望如何在其他情况下重复使用模块,通常一种模式会更自然.


Pat*_*rts 22

如果要避免全局范围,请将其io存在于单独的文件中,如下所示:

var sio = require('socket.io');
var io = null;

exports.io = function () {
  return io;
};

exports.initialize = function(server) {
  return io = sio(server);
};
Run Code Online (Sandbox Code Playgroud)

然后在app.js:

var server = require('http').createServer(app);
var io = require('./io').initialize(server);
require('./app/consumers/ditconsumer'); // loading module will cause desired side-effect
server.listen(...);
Run Code Online (Sandbox Code Playgroud)

并在consumer.js:

require('../io').io().on('connection', function(socket) {
  logger.log('info', message.value);
  socket.on('message', function(message) {
    socket.emit('ditConsumer',message.value);
    console.log('from console',message.value);
  });
});
Run Code Online (Sandbox Code Playgroud)

  • 这家伙,这家伙f**ks.#piedPiperReference.这个小模块配合的出色工作,帮助我完成了一大堆我正在做的练习. (2认同)

Aun*_*Man 5

我找到了一个简单的解决方案。在 app.js 中使用全局变量并从其他文件访问它。

global.io = require('socket.io').listen(server);