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

编程入门 行业动态 更新时间:2024-10-28 00:21:05

<a href=https://www.elefans.com/category/jswz/34/1771197.html style=如何处理在app.js中未定义的socket.io"/>

如何处理在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

本文发布于:2024-05-07 08:43:04,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1755448.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:如何处理   中未   定义   app   io

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!