У вас проблема с порядком загрузки. Вы загружаете app.js
в index.js
ДО того, как создадите и установите io
в качестве свойства приложения. Итак, когда app.js
пытается использовать свойство io
, оно еще не было установлено.
То, как вы делите вещи между файлами, вы создали циклическую зависимость. Вы не можете создать io
, пока не создадите сервер, но вы не можете создать сервер, пока у вас не будет app
, который находится в app.js
. Итак, вы не можете создать io
до загрузки app.js
.
Есть много способов обойти это. Мне кажется странным, что вы создаете объект server
в одном файле и объект app
в другом файле, поскольку оба они полностью необходимы для создания работоспособного сервера. Итак, я бы изменил, как это делается, вот так:
// index.js
const http = require('http');
const app = require('express')();
const server = http.createServer(app);
const io = require('socket.io')(server);
app.set('socketio', io);
require('./app.js')(app);
const config = require('./utils/config');
const logger = require('./utils/logger');
server.listen(config.PORT, () => {
logger.info(`Listening on port ${config.PORT}`);
});
А затем измените app. js вот так:
const config = require('./utils/config');
const middleware = require('./utils/middleware');
module.exports = function(app) {
app.use(middleware.requestLogger);
const io = app.get('socketio');
io.on('connection', (socket) => {
io.emit('test', { test: 'test' });
});
app.use(middleware.errorHandler);
}
Есть 100 других способов организовать код, чтобы исправить это. Экспорт функции, которую вы можете вызвать, и передачу этой функции одного или нескольких аргументов - это один из способов помочь контролировать время этих циклических зависимостей.