Что делать, если socket.io не определен в app. js - PullRequest
0 голосов
/ 09 мая 2020

Мой express журнал приложения c отделен от экземпляра сервера express в отдельный файл, поэтому у меня возникают проблемы с доступом к socket.io в этом файле приложения. Должен ли я просто переместить реализацию socket.io в index. js или можно сохранить этот logi c в приложении. js?

index. js

const http = require('http');
const app = require('./app');
const server = http.createServer(app);

const io = require('socket.io')(server);
const config = require('./utils/config');
const logger = require('./utils/logger');

app.set('socketio', io);

server.listen(config.PORT, () => {
  logger.info(`Listening on port ${config.PORT}`);
});

приложение js

const express = require('express');
const config = require('./utils/config');
const middleware = require('./utils/middleware');

const app = express();

app.use(middleware.requestLogger);

const io = app.get('socketio');

io.on('connection', (socket) => {
      io.emit('test', { test: 'test' });
});

app.use(middleware.errorHandler);


module.exports = app;

1 Ответ

1 голос
/ 09 мая 2020

У вас проблема с порядком загрузки. Вы загружаете 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 других способов организовать код, чтобы исправить это. Экспорт функции, которую вы можете вызвать, и передачу этой функции одного или нескольких аргументов - это один из способов помочь контролировать время этих циклических зависимостей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...