Saltar al contenido

Use socket.io dentro de un archivo de rutas rápidas

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 llamar app.enable('foo'). Del mismo modo, llamar app.set('foo', false)
para una propiedad booleana es lo mismo que llamar app.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ó.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *