J'ai un problème avec le socket dans mon programme. exporter la connexion "io" et bien que je puisse diffuser à partir de n'importe quelle partie du programme normal (juste en faisant référence à "io"), je ne peux pas utiliser "socket" et diffuser avec lui à moins qu'il ne soit dans la même connexion de "io". Je voudrais savoir comment utiliser socket depuis n'importe quelle autre partie du programme, avec des fonctions telles que "socket.emit ()" ou "socket.broadcast.emit" etc. Ou comment appeler celui-ci.

Voici mon index.js:

const express = require('express');
const restApi = express();
const cors = require('cors');
const server = require('http').createServer(restApi);
const rutas = require('./src/routes/Routes.js');
const io = require('./src/socket/SocketManager.js');
io.attach(server);

restApi.use(express.json());
restApi.use(express.static('public'));
restApi.use(cors());
restApi.options('*', cors());

server.listen(4040, () => console.log('Listening server in port 4040'));

restApi.all('/*', function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "X-Requested-With");
  next();
});

restApi.use('/api',rutas);

mes managersocket.js:

const io = require('socket.io')();

io.on('connection', function (socket) {
    console.log('NUEVA CONEXION: ',socket.id);
    socket.emit('recoger',socket.id);
});

module.exports = io;

C'est là que je voudrais utiliser le socket ou au moins appeler la fonction.

et User.js:

var io = require('../../socket/SocketManager');

var RouterUser = function(){

  this.practicafuncion = function (req,res){
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Headers", "X-Requested-With");
    console.log('probando entrar por rest y que salga un mensaje por socket');
    res.send({
      status:'Aprobado',
      msj:'Enviado por rest'
    });
//this works correctly.     io.sockets.emit('mensaje','**MENSAJESERVIDORPORSOCKET**');
//This is not the problem when using "socket".   socket.broadcast.emit('mensaje','**MENSAJESERVIDORPORSOCKET**');
  };
}

module.exports = function(){
  var instancia = new RouterUser();
  return instancia;
};

même est le référentiel où le code entier est

https://github.com/proxirv/Socket.io-router
1
proxirv 7 nov. 2019 à 23:50

1 réponse

socket est un objet temporaire qui existe uniquement pour la durée d'une connexion client particulière. Et, il peut y en avoir des millions (un ou plusieurs pour chaque client connecté). En tant que tel, vous ne vous contentez pas d'exporter un socket ou de le bourrer dans un global et essayez de l'utiliser partout.

Donc, si ce que vous essayez de faire est d'accéder à la connexion socket.io pour l'utilisateur pour lequel vous venez de recevoir une demande http, c'est un peu plus compliqué et il existe plusieurs façons de l'aborder.

Une approche que j'ai utilisée auparavant est illustrée ci-dessous:

const express = require('express');
const app = express();
const server = app.listen(80);
const io = require('socket.io')(server);
const expsession = require('express-session');
const path = require('path');

// install session middleware
const sessionMiddleware = expsession({
  secret: 'random secret',
  saveUninitialized: true,
  resave: true
});

// run session middleware for regular http connections
app.use(sessionMiddleware);

// run session middleware for socket.io connections
io.use(function(socket, next) {
    sessionMiddleware(socket.request, socket.request.res, next);
});

// when a socket.io connection connects, put the socket.id into the session
// so it can be accessed from other http requests from that client    
io.on('connection', function(socket) {
    // socket.handshake.headers
    console.log(`socket.io connected: ${socket.id}`);

    // save socket.io socket in the session
    console.log("session at socket.io connection:\n", socket.request.session);
    socket.request.session.socketio = socket.id;
    socket.request.session.save();
});

// any arbitrary express route definition
// Note: you can't send socket.io data in a request that loads an HTML page
//       because that client hasn't yet established the socket.io connection
//       for that page.  The socket.io connections will be created after
//       the browser loads this page.
app.get("/", function(req, res) {
    const session = req.session;
    console.log("\n\npage load\n---------------------------\n");
    console.log("session:\n", session);
    res.sendFile(path.join(__dirname, "socket-io-session.html"));
});

// Upon an API call from a page that already has a socket.io connection,
// respond to the API call and send something to that page's socket.io socket
app.get("/api/test", function(req, res) {
    const session = req.session;
    io.sockets.connected[session.socketio].emit('show', "sending some data");
    console.log("session:\n", session);
    console.log("session.socketio:\n", session.socketio);
    res.json({greeting: "hello"});
});

Voici les étapes de ce concept:

  1. Configurez une session express pour les connexions http régulières. Cela vous donne un endroit pour stocker des choses qui appartiennent à un client particulier (saisies par un cookie)
  2. Configurez express-session pour la connexion socket.io afin que vous puissiez également avoir accès aux données de session express dans les connexions socket.io.
  3. Lorsqu'une connexion socket.io se produit, stockez le socket.id dans la session. Cela rend le socket.id disponible pour les futures requêtes http de ce client spécifique
  4. Lorsqu'une future requête http arrive de ce client, vous pouvez accéder à la session, obtenir la valeur socket.id (qui n'est qu'une chaîne), puis l'utiliser pour obtenir le socket pour cet utilisateur et une fois que vous avez le socket, vous peut utiliser socket.emit() pour envoyer des données uniquement à cet utilisateur.

Si vous n'aviez pas d'autres raisons d'utiliser express-session, vous pouvez également mettre le socket.id dans un cookie tout seul lorsque la connexion socket.io se connecte, puis obtenir le socket.id du cookie lors de votre requête http .

0
jfriend00 7 nov. 2019 à 22:19