Socket io从快速控制器方法

时间:2015-04-29 15:54:24

标签: node.js express socket.io

我知道通常你会app.js创建套接字服务器,并将该实例传递给你的路由器,而路由器又可以将它传递给控制器​​方法。如此处所示(Socket.io emit from Express controllers

但是,我有一个控制器方法,需要向正在侦听的任何客户端发出进度,但是这个方法可以从许多不同的路由和其他控制器执行,我真的不想要通过在应用的所有其他部分引用socket

有更好的方法吗?

我在想像socketio辅助模块。 app.js模块将io的引用传递给它,稍后可以检索....

app.js

var io = require('socket.io').listen(server);    
require('./helpers/socketio').set(io);

助手/ socketio.js

var io=null;

exports.set = function(socketio) {
   io=socketio;
}

exports.get = function() {
  return io;
}

然后,只要你在应用程序中需要它..

var io = require('./helpers/socketio').get();
io.emit('message', {a:1, b:2});

有更清洁的方法吗?显然它可以返回null,你必须检查它。它只是感觉不对....

3 个答案:

答案 0 :(得分:1)

  

模块在第一次加载后被缓存。

实际上,您可以在helper/socketio.js验证socket.io。 虽然从其他文件中调用require() socketio.js,但node.js只会对该文件执行一次代码。

You can look Node Documentation

答案 1 :(得分:0)

一个对我有用的解决方案是将io分配给app:

 app.io = io in app.js

然后,在有权访问该应用程序对象的任何地方,您都具有指向套接字的链接。

示例:

file: index.js my main routing file for authenticated users

const express = require('express');

const router = express.Router();

const { ensureAuthenticated } = require('../config/auth');

...文件的其余部分

// Dashboard

router.get('/dashboard', ensureAuthenticated, (req, res) =>{

  res.render('dashboard')  //sends the dashboard page to the user

  req.app.io.emit('hello',req.user.name + ' Has Joined' ) 
 // lets every one else know that a new user has joined

})

答案 2 :(得分:0)

这对我有用:

创建一个js文件并添加类似的内容

const service = {}

    const server = require('http').Server()
    const io = require('socket.io')(server, {
    cors: {
        origins: ['http://localhost:4200']
    }
});

service.inicializar = () => {
    io.on('connection', (socket) => {
        const idHandShake = socket.id;
        const { email } = socket.handshake.query;

        socket.join(email);

        console.log(`Conexion establecida --> ${idHandShake}`);

        //Este metodo escucha lo que envia el front y tiene la capacidad de emitir hacia otros miembros de la sala.
        socket.on('event', (res) => {
            const data = res
            console.log(data)

            //Envia un mensaje a todos los participantes del room
            socket.to(email).emit('event', data);
        })
    })
    return io;
}

service.emitEvent = async (email, mensaje) => {
    const sockets = await io.in(email).fetchSockets();
    sockets[0].emit('event', mensaje);
}
service.emitSesionIniciada = async (email, mensaje) => {
    console.log('email de session iniciada: ', email);
    const sockets = await io.in(email).fetchSockets();
    sockets[0].emit('sessionIniciada', mensaje);
}

module.exports = service;

你可以看到我在服务对象上导出了一些方法。您可以稍后从其他文件中使用它,只需引用这个

在你的 server.js 或 app.js 中,无论你运行什么服务器

const socket = require('./src/services/socket')---< this is refering the file you created
const io = socket.inicializar() ---> this call it just one. Initialize the server.

希望这会有所帮助。问候。