Poseemos la mejor información que encontramos en línea. Nosotros esperamos que te sirva de ayuda y si puedes aportar cualquier detalle que nos pueda ayudar a mejorar hazlo libremente.
Solución:
Hay una mejor manera de hacer esto ahora con Express 4.0.
Puede usar app.set() para almacenar una referencia al io
objeto.
Configuración Base:
var app = require('express')();
var server = app.listen(process.env.PORT || 3000);
var io = require('socket.io')(server);
// next line is the money
app.set('socketio', io);
Ruta interna o middleware:
exports.foo = function(req,res)
// now use socket.io in your routes file
var io = req.app.get('socketio');
io.emit('hi!');
Información sobre app.set()
y app.get()
Esta abajo:
app.set(nombre, valor)
Asigna el nombre del ajuste al valor. Puede almacenar cualquier valor que desee, pero se pueden usar ciertos nombres para configurar el comportamiento del servidor. Estos nombres especiales se enumeran en la tabla de configuración de la aplicación.
Vocación
app.set('foo', true)
para una propiedad booleana es lo mismo que llamarapp.enable('foo')
. Del mismo modo, llamarapp.set('foo', false)
para una propiedad booleana es lo mismo que llamarapp.disable('foo')
.Recuperar el valor de un ajuste con
app.get()
.
Fuente: https://expressjs.com/en/api.html#app.set
Puede configurar su archivo de rutas como una función y pasar el objeto Socket.IO cuando requiera el archivo.
module.exports = function(io)
var routes = ;
routes.index = function (req, res)
io.sockets.emit('payload');
res.render('index',
title: "Awesome page"
);
;
return routes;
;
Entonces requiere rutas como esta:
var express = require('express');
var app = express();
var http = require('http');
var server = http.createServer(app);
var io = require('socket.io').listen(server);
var routes = require('./routes')(io);
La respuesta de aarosil fue excelente, pero me encontré con el mismo problema que Víctor al administrar las conexiones de los clientes con este enfoque. Por cada recarga en el cliente, obtendría la misma cantidad de mensajes duplicados en el servidor (2.ª recarga = 2 duplicados, 3.ª = 3 duplicados, etc.).
Ampliando la respuesta de aarosil, utilicé este enfoque para usar el objeto de socket en mi archivo de rutas y administrar las conexiones/controlar los mensajes duplicados:
Archivo del servidor interno
// same as aarosil (LIFESAVER)
const app = require('express')();
const server = app.listen(process.env.PORT || 3000);
const io = require('socket.io')(server);
// next line is the money
app.set('socketio', io);
Archivo de rutas internas
exports.foo = (req,res) =>
let socket_id = [];
const io = req.app.get('socketio');
io.on('connection', socket =>
socket_id.push(socket.id);
if (socket_id[0] === socket.id)
// remove the connection listener for any subsequent
// connections with the same ID
io.removeAllListeners('connection');
socket.on('hello message', msg =>
console.log('just got: ', msg);
socket.emit('chat message', 'hi from server');
)
);
Reseñas y valoraciones
Recuerda algo, que te brindamos la opción de reseñar si te ayudó.