我知道通常你会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,你必须检查它。它只是感觉不对....
答案 0 :(得分:1)
模块在第一次加载后被缓存。
实际上,您可以在helper/socketio.js
验证socket.io。
虽然从其他文件中调用require()
socketio.js
,但node.js只会对该文件执行一次代码。
答案 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.
希望这会有所帮助。问候。