使用 socket.io 连接作为模块

Using socket.io connection as a module

我通过 Rabbitmq 创建了一个队列系统,并通过套接字向用户发送通知。基本上有3个文件。

-index.js            //some functions to save data and send to Rabbitmq 
-socket.js           //socket io modules 
-consumer.js         //some functions to consume data from Rabbitmq

当 npm 运行 index.js 和 consumer.js 启动时。

index.js

const Express = require('express');
const app = Express();

//init server 
server = app.listen(3000);
//init socket io
require('./socket').initialize(server);

socket.js

const sio = require('socket.io');

let io;
module.exports = {
    //Initialize the socket server
    initialize: (server) => {
        io = sio(server, {
            cors: {
                origin: '*',
            }
        });
        io.on('connection', (socket) => {
            console.log('New client connected with id = ', socket.id);
            socket.on('disconnect', () => {
                console.log("User disconnected");
            });
        });
    },
    //return the io instance
    getInstance: () => {
        return io;
    }
}

consumer.js

const socket = require('./socket');
const io = socket.getInstance();
console.log("io", io);
//io is undefined

Io returns 在 consumer.js 中未定义。哪里错了?

在有人先呼叫 socket.initialize() 之前,您不能呼叫 socket.getInstance()

您没有显示 consumer.js 的加载位置,因此我们无法了解模块加载的完整顺序,但似乎 consumer.js 在您初始化套接字之前就已加载,因此它正在尝试在要获取套接字实例之前调用 socket.getInstance()

当使用 return 声明从以前的方法构建的方法时,以正确的顺序调用事物显然很重要。