Как я могу манипулировать данными socket.io, возможно, через прокси или как промежуточное ПО? - PullRequest
0 голосов
/ 27 декабря 2018

Я искал в Google и SO в течение нескольких недель, чтобы решить эту проблему, которая беспокоит меня.Сначала я опишу, какова моя цель, затем я попытаюсь объяснить, насколько близко я подошел к ее решению.

Цель:

Чтобы внедрить небольшой express сервер междубольшое приложение и его data-api с единственной целью - манипулировать ответами на данные с сервера (или обрабатывать пользовательские ответы вместо тех, на которые ответил сервер).

Мы используем socket.io для подключенияклиент с сервером, и на самом деле есть несколько драгоценных событий, которые я действительно хочу изменить.Большинство событий, которые я хочу проксировать между клиентом и сервером, не изменяются.

Однако есть несколько драгоценных событий, которые я хочу, чтобы пользовательские ответы отправлялись обратно клиенту для целей тестирования

То, что я пробовал:

Я пытался сделать базовый экспресс-сервер и socket.io-client, и socket.io сервер.Однако я не знаю, как передавать свои запросы друг другу, и особенно настороженно отношусь к возможности отслеживания нескольких клиентов.Связывание здесь является ключом, и я в замешательстве

Я также пытался использовать http-proxy , который приблизил меня довольно близко, однако единственное, что я до сих пор смогнужно проверять полезные данные, когда они приходят и уходят, используя socket.on('data', (data) => { /* do something */ }); внутри моего proxy.on('open', socket => {}); события.

Так что, хотя я могу видеть, как поступают и уходят тонны данных, мне все еще нужен шанс манипулировать ими.

Это кто-то делал раньше?Есть ли хороший ресурс о том, как заставить экспресс-сервер выступать в роли прокси-сервера, подключая клиентские соединения к серверу?

Заранее благодарим за Ваш опыт.Боюсь, это может быть слишком сложно.

1 Ответ

0 голосов
/ 31 декабря 2018

Хорошо, как я и обещал, я нашел половину своего идеального решения.В идеале я хочу прокси все события назад и вперед и прослушивать только несколько ключевых событий, но я еще не понял эту часть.Если кто-то может помочь мне в этом начинании, я был бы всегда благодарен.

Вместо этого я просто отображаю все события, которые излучает каждый конец сокета, и хороню их в подключенных вызовах.

Вот гайки и болты о том, как я сделал то, что хотел - вы создаете server как обычно, а при его соединении вы затем инициируете соединение client из вызова .on('connection', () => {});.Оказавшись в этой области, вы можете быть относительно уверены, что оба соединения открыты, и начинать передавать события туда и обратно.В идеале вы будете проверять наличие активного соединения, но если ваш сервер и / или клиент оборудованы для обработки разорванного соединения, вы, вероятно, в порядке.

В моем простом примере ниже вы увидите, как я передаю событиятуда и обратно, и он выполняет свою работу.Как я уже сказал, если кто-то может помочь мне с подходом с подстановочными знаками (который я не смог получить по какой-то причине), пожалуйста, дайте мне знать!

// GLOBAL CONFIGS
const serverConfig = {}; // Feel free to add your desired options here

// Some of these options pertain more to me than they will to you; don't feel like
// you have to copy these configs
const clientConfig = {
  // We don't want to pre-emptivly try to connect to data-api,
  // because we need our client to give us data first.
  autoConnect: false,
  multiplex: false,
  // Disables/bypasses long polling which causes the connection to
  // be severed then re-connected (for my api at least)
  transports: ["websocket"]
};

const PORT = 3000;
const PROXY_HOST = '<api-endpoint-goes-here>'
const NAMESPACE = '<the name of your namespace, if applicable>';

// SERVER STUFF - this will connect to your client
const app = require('express')();
const server = require('http').Server(app);
const cors = require('cors');
const io = require('socket.io')(server, serverConfig);
const nsp = io.of(`/${NAMESPACE}`);

// CLIENT STUFF - this will connect to your api server as a client
const client = require('socket.io-client');
const ioClient = client(`${PROXY_HOST}/${NAMESPACE}`, clientConfig);

// Self explanatory I hope
app.use(cors());

// I am going to call this a root socket - meaning no namespace. Not entirely useful for now unless
// we want to inspect transitions in and out of our namespace, but just putting it here FYI
io.on('connection', socket => {
  console.log(`A connection to the root socket made ${socket.handshake.headers.origin}`);

  socket.on('disconnect', () => {
    console.log(`A client disconnected from the root socket.`);
  });
});

// Serve up a basic html file so that we can interact with our socket.io instance in the
// console. This index.html has a similar setup with a socket connection to both the data
// api and this test server, so I can ping events via console and test how this is working
app.get('/', (req, res) => {
  res.sendFile(path.join(__dirname + '/index.html'));
});

// Run the server
server.listen(PORT, () => console.log('Test data server is running'));

// Here's where the real solution reveals itself for me :)

// Listen for connections to the namespace we are looking for - this is the meat & potatoes of our app
nsp.on('connection', socket => {
  console.log(`the ${NAMESPACE} namespace was connected`);

  // Time to initiate a connection to the ioClient because we need it for the app now
  ioClient.connect();

  // Now check to make sure ioCLient is connected. Once we get inside here, we can be 
  // reasonably sure that we have a connection to both the client, and the data-api
  ioClient.on('connect', () => {
    // Acknowledge we have connected to the data-api
    console.log('Connected to data-api via socket.io');

    // Events sent from data-api
    ioClient.on('<your event>', data => {
      socket.emit('<your event>', data);
    });

    ioClient.on('<your event with two params>', (data1, data2) => {
      socket.emit('<your event with two params>', data1, data2);
    });
    
    // ... etc

    // Other event catchers for ioClient
    ioClient.on('disconnect', () => {
      console.log('Disconnected from the data-api');
    });
    
    ioClient.on('error', err => {
      console.error('Error with the data-api connection: ', err);
    });

    // Events sent from the app client
    socket.on('<your event>', data => {
      ioClient.emit('<your event>', data);
    });

    socket.on('<your event with two params>', (data1, data2) => {
      ioClient.emit('<your event with two params>', data1, data2);
    });
    
    // ... etc
  });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...