Javascript 从另一个文件访问SocketIO
我正试图从一个单独的文件发送到所有连接的套接字。然而,我似乎无法理解 Socket.jsJavascript 从另一个文件访问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
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
时才工作。工作得很好,非常感谢。救了我的命