Я пытаюсь использовать socket.io из двух файлов: server.js и /routes/api.game.js.
Мой server.js:
...
const server = require('./middleware/socket').server;
const io = require('./middleware/socket').io;
io.on('connection', (socket) => {
socket.on("startGame", () => {
io.emit('gameStarted')
});
});
Это излучение работает корректно
Мой /middleware/socket.js:
const express = require("express");
const app = express();
const bodyParser = require("body-parser");
const http = require('http');
const cors = require("cors");
const path = require('path');
const server = http.createServer(app);
const io = require('socket.io')(server);
const games = require("../routes/api/games");
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
app.use(cors());
app.use("/api/games", games);
app.use('/public', express.static(path.join(__dirname, '/public')));
app.get('/', (req, res) => {
res.send("IT'S WORKING!")
})
module.exports = { io: io, app: app, server: server };
И мой /routes/api/game.js:
const server = require('../../middleware/socket').server;
const io = require('../../middleware/socket').io;
router.get("/start/:handle", (req, res) => {
io.emit('nextquestion')
})
module.exports = router;
Но вот выброс показывает ошибку TypeError: Невозможно прочитать свойство "испускать" неопределенного.
Как я могу вызвать излучение из файла game.js?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете видеть, что у вас есть циклическая зависимость:
socket.js требует game.jsgame.js требует socket.js, который еще не инициализирован, поэтому объект равен пустому объектуВ качестве наилучшей практики я бы рекомендовал никогда не инициализировать объекты вне функции, потому что это похоже на применение побочного эффекта при вызове require.
game.js требуется только socket.io, поэтому, если вы разделите socket.js, вы можете легко избавиться от циклической зависимости.
Одним из решений может быть обертка socket.io:
const socketIO = require('socket.io');
const self = module.exports = {
io: {},
start: server => {
self.io = socketIO(server)
}
};
После запуска вы уверены, что io инициализирован.
Мэйби что-то не так с вашим путем к 'io'. Не могли бы вы распечатать структуру вашего проекта?