最新消息: 电脑我帮您提供丰富的电脑知识,编程学习,软件下载,win7系统下载。

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

IT培训 admin 15浏览 0评论

如何处理在app.js中未定义的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('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加载到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种其他方法来组织代码来解决此问题。导出可以调用的函数并将一个或多个参数传递给该函数是帮助控制这些循环依赖项的时间的一种方法。

如何处理在app.js中未定义的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('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加载到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种其他方法来组织代码来解决此问题。导出可以调用的函数并将一个或多个参数传递给该函数是帮助控制这些循环依赖项的时间的一种方法。

发布评论

评论列表 (0)

  1. 暂无评论