如何将 socket.io 共享到 nodejs 中的其他模块?

Tha*_*tro 5 module node.js express socket.io

我的项目在节点中有以下结构

项目结构

在 app.js 中,假设我有一个这样的 app.js

'use strict'
const express = require('express');

const realtime = require('./controllers/realtime');

const app = express();
const server = require('http').Server(app);



var sessionMiddleware = session(sessionConfig);
realtime(server,sessionMiddleware);
Run Code Online (Sandbox Code Playgroud)

在控制器/realtime.js 中

"use strict";
const config = require("../config");

module.exports = (server,sessionMiddleware) => {
    const io = require('socket.io')(server);

    io.use(function(socket, next) {
        sessionMiddleware(socket.request, socket.request.res, next);
    });

    io.on('connection', (socket) => {

        socket.on('statusConnetion',(data)=>{
            console.log(data)
        });

        socket.on('disconnect', function () {
            console.log(socket.id,"Un socket se desconecto");
        });

        console.log(`New socket connection: ${socket.id}`);
    });    
}
Run Code Online (Sandbox Code Playgroud)

在控制器/cargos.js

const express = require('express');
const router = express.Router();
let cargos = {};

cargos.update = (req, res, next) =>{
    //How can I use sockets here?
}

module.exports = cargos;
Run Code Online (Sandbox Code Playgroud)

如何在文件 cargos.js 和其他控制器中使用套接字?

Rom*_*anY 8

您不仅可以导出启动服务器的函数,还可以导出处理所有 socket.io 连接和功能的类。这个类将是一个单例,将具有使用连接的函数,并且可以在不同的模块中使用。

示例:app.js:

'use strict'
const express = require('express');

const realtime = require('./controllers/realtime');

const app = express();
const server = require('http').Server(app);



var sessionMiddleware = session(sessionConfig);
realtime.connect(server,sessionMiddleware);
Run Code Online (Sandbox Code Playgroud)

实时.js:

let connection = null;

class Realtime {
    constructor() {
        this._socket = null;
    }
    connect(server,sessionMiddleware) {
        const io = require('socket.io')(server);

        io.use(function(socket, next) {
            sessionMiddleware(socket.request, socket.request.res, next);
        });
        io.on('connection', (socket) => {
            this._socket = socket; 
            this._socket.on('statusConnetion',(data)=>{
                console.log(data)
            });

            this._socket.on('disconnect', function () {
                console.log(socket.id,"Un socket se desconecto");
            });

            console.log(`New socket connection: ${socket.id}`);
        });
    }

    sendEvent(event, data) {
        this._socket.emit(event, data);
    }

    registerEvent(event, handler) {
        this._socket.on(event, handler);
    }

    static init(server,sessionMiddleware) {
        if(!connection) {
            connection = new Realtime();
            connection.connect(server,sessionMiddleware);
        }
    }

    static getConnection() {
        if(!connection) {
            throw new Error("no active connection");
        }
        return connection;
    }
}

module.exports = {
    connect: Realtime.init,
    connection: Realtime.getConnection 
}
Run Code Online (Sandbox Code Playgroud)

货物.js:

const express = require('express');
const router = express.Router();

let cargos = {};

cargos.update = (req, res, next) =>{
    const connection  = require('./controllers/realtime').connection();
    connection.sendEvent("update", {params: req.params});
}

module.exports = cargos;
Run Code Online (Sandbox Code Playgroud)