Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/438.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从另一个文件访问SocketIO_Javascript_Node.js_Socket.io - Fatal编程技术网

Javascript 从另一个文件访问SocketIO

Javascript 从另一个文件访问SocketIO,javascript,node.js,socket.io,Javascript,Node.js,Socket.io,我正试图从一个单独的文件发送到所有连接的套接字。然而,我似乎无法理解 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.ex

我正试图从一个单独的文件发送到所有连接的套接字。然而,我似乎无法理解

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;
var socket = require('../socket');

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

setInterval(function(){
    news();
}, 5 * 1000);
Users.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;
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解析为news函数,也没有将my函数移动到socket文件?

只需创建一个
socket服务
对象,服务对象只发布了一些
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);

我通过改变
模块.exports中的位置来解决这个问题。初始化
socket
变量后,我立即将其放入,因为这是我导出它的唯一方法。

您可以在UTIL和io函数中使用let将io对象定义为全局变量。您可以从任何文件调用这些函数。例如:

//app.js
const{socketConnection}=require('./utils/socket io');
const http=require('http');
const express=require('express');
常量app=express();
const server=http.createServer(app);
socketConnection(服务器);
//utils/socket io
让我来;
exports.socketConnection=(服务器)=>{
io=require('socket.io')(服务器);
io.on('连接',(套接字)=>{
info(`Client connected[id=${socket.id}]`);
socket.join(socket.request.\u query.id);
socket.on('disconnect',()=>{
info(`Client disconnected[id=${socket.id}]`);
});
});
};
exports.sendMessage=(roomId,key,message)=>io.to(roomId).emit(key,message);
exports.getRooms=()=>io.sockets.adapter.rooms;
//任何文件
const{sendMessage}=require('../utils/socket io');
const foo=async()=>{
const roomId='12345';
常量键='新顺序';
const message='分配的新订单';
发送消息(房间ID、钥匙、消息);
};

@JackBashford我很确定,无论你是否添加
.js
,我都喜欢这样做,因为它看起来很干净。当我用
npm start
运行我的应用程序时,它会停止工作,
socket
是空的,它只在我单独运行
users.js
时才工作。工作得很好,非常感谢。救了我的命