从另一个文件访问SocketIO

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从另一个文件访问SocketIO相关的知识,希望对你有一定的参考价值。

我正在尝试向从单独文件连接的所有套接字发射。但我似乎无法弄明白。

Socket.js

var socketio = require('socket.io');
var users = require('./modules/users');

var io = socketio();
socket.io = io;

io.on('connection', function(socket){
  //Stuff
  console.log('Hello :)');
});

module.exports = socket;

Users.js

var socket = require('../socket');

function news(){
    socket.io.sockets.emit('news', {
        message: 'Woah! Thats new :)'
    })
}

setInterval(function(){
    news();
}, 5 * 1000);

但是,users.js中的socket似乎是空的,我似乎无法访问io对象。我该如何制作它以便我可以向所有用户发射?没有将io.sockets解析为新闻函数或将我的函数移动到套接字文件?

答案

Users.js

exports = module.exports = function(io){
  io.sockets.on('connection', function (socket) {
    socket.on('news', {
        message: 'Woah! Thats new :)'
    })
  });
}

App.js

const app = require('http').createServer(handler)
const io = require('socket.io').listen(app)
const Users = require('./modules/users')(io)
// const anotherModule = require('./modules/anotherModule')(io)
// const andSoOn = require('./modules/andSoOn')(io)

// and emit it here
setInterval(function(){
    io.emit('news')
}, 5 * 1000);

// you can expose the io object to other files
exports.io = io

希望现在对你有意义。

另一答案

只需创建一个socket service对象,服务对象只发布一些helper函数。

案例示例:

// Socket.js
var socketio = require('socket.io');
var users = require('./modules/users');

var io = socketio();
socket.io = io;

io.on('connection', function (socket) {
  //Stuff
  console.log('Hello :)');
});

var toAll = function (eventName, data) {
  io.sockets.emit(event, data);
}

module.exports = {
  toAll: toAll // publish `toAll` function to call every where
};


// Users.js
var socketService = require('../socket');

function news() {
  socketService.toAll('news', {
    message: 'Woah! Thats new :)'
  });
}

setInterval(function () {
  news();
}, 5 * 1000);
另一答案

我设法通过改变module.exports的位置来解决这个问题。我在初始化socket变量之后立即把它放了,因为它是我输出它的唯一的东西。

以上是关于从另一个文件访问SocketIO的主要内容,如果未能解决你的问题,请参考以下文章

我如何使用视图模型从另一个片段访问函数

热门从另一个片段导航到主页片段

使用意图从另一个片段调用一个片段

从另一个活动的活动中的片段传递数据

从另一个提供循环依赖的模块打开活动

从另一个片段打开一个片段始终保留前一个片段标题