Node.js 如何处理app.js中未定义的socket.io

Node.js 如何处理app.js中未定义的socket.io,node.js,express,socket.io,Node.js,Express,Socket.io,我的express应用程序逻辑与express服务器的实例化分离到一个单独的文件中,因此我在访问此应用程序文件中的socket.io时遇到问题。我应该将socket.io实现移到index.js中,还是可以将该逻辑保留在app.js中 index.js const http = require('http'); const app = require('./app'); const server = http.createServer(app); const io = require('soc

我的express应用程序逻辑与express服务器的实例化分离到一个单独的文件中,因此我在访问此应用程序文件中的socket.io时遇到问题。我应该将socket.io实现移到index.js中,还是可以将该逻辑保留在app.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}`);
});
app.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;

您有一个装载顺序问题。在创建应用程序属性并将其设置为应用程序属性之前,您正在将
app.js
加载到
index.js
。因此,当
app.js
尝试使用
io
属性时,它还没有被设置

通过在文件之间分割内容的方式,创建了循环依赖关系。在创建服务器之前,您无法创建
io
,但在拥有
app.js
中的
app
之前,您无法创建服务器。因此,在加载
app.js
之前,无法创建
io

有很多方法可以解决这个问题。我觉得有点奇怪,你在一个文件中创建了
服务器
,在另一个文件中创建了
应用程序
对象,因为这两个都是制作一个运行服务器所必需的。所以,我要重新安排这些事情是怎么做的,就像这样:

// 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}`);
});
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);
}
然后,修改app.js,如下所示:

// 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}`);
});
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种其他方法可以组织代码来解决这个问题。导出一个可以调用的函数并向该函数传递一个或多个参数是帮助控制这些循环依赖项的计时的一种方法。

谢谢,我按照您的建议重新安排了,它解决了这个问题,我认为这是一个顺序问题,但不确定如何解决它。再次感谢!