помогите разобратся с экземплярами класса

Я использую MQL5-Connector-Js для того что бы получать данные с двух терминалов МТ5.

Код подключения к первому терминалу:

firstBrocker = require('mql5-connector-js')

new firstBrocker.ConfigContext({
  host_ip: "127.0.0.1", // server ip
  protocol: "tcp", // transfer protocol
  port1: 3033, // push socket port
  port2: 3034, // pull socket port
  port3: 3035, // publisher socket port
  timeout_ms: 1000 // wait for messages from server until timeout
}).init();

exports.getBid = (symbol, callback)=>{
  firstBrocker.SymbolInfo.bid(symbol).then(price => {
    callback(price)
    console.log(symbol + "Bid price : " + price)
  });
}

exports.getAsk = (symbol, callback) =>{
  firstBrocker.SymbolInfo.ask(symbol).then(price => {
    callback(price)
    console.log(ffirstBrockerf.ConfigContext.toString());
  })
}

Код подключения ко второму:

const secondBrocker = require('mql5-connector-js')

 new secondBrocker.ConfigContext({
  host_ip: "127.0.0.1", // server ip
  protocol: "tcp", // transfer protocol
  port1: 3036, // push socket port
  port2: 3037, // pull socket port
  port3: 3038, // publisher socket port
  timeout_ms: 1000 // wait for messages from server until timeout
}).init();

exports.getBid = (symbol, callback)=>{
  secondBrocker.SymbolInfo.bid(symbol).then(price => {
    callback(price)
    console.log(symbol + "Bid price : " + price)
  });
}

exports.getAsk = (symbol, callback) =>{
  secondBrocker.SymbolInfo.ask(symbol).then(price => {
    callback(price)
    console.log(secondBrocker.ConfigContext.toString());
  })
}

но первый и второй подключается к портам первого. Что я делаю не так?


Ответы (1 шт):

Автор решения: nörbörnën

Библиотека mql5-connector-js написана немного странно: при создании объекта класса ConfigContext и последующем вызове метода .init "создаётся" соединение с внешним сервисом, но если до этого соединение было создано - оно переиспользуется и при этом переданные параметры соединения игнорируются.

Я могу предложить два способа как изменить такое поведение библиотеки:

  1. форкнуть проект и написать иначе код, мешающий созданию второго соединения
  2. перед созданием второго соединения выкинуть из памяти nodejs всё, что она знала о ранее подключёной require библиотеке. это не нарушит поведение ранее созданного ConfigContext при этом позволит создать новый ConfigContext с новым соединением.

Пример реализации п.2:

Первое соединение, файл f.js

// удаление информации о подключении библиотеки из require.cache
Object.keys(require.cache || {}).forEach((x) => {
  if (x.includes('mql5-connector-js')) {
    delete require.cache[x];
  }
});

const { ConfigContext, SymbolInfo } = require('mql5-connector-js')

const context = new ConfigContext({
  host_ip: "127.0.0.1", // server ip
  protocol: "tcp", // transfer protocol
  port1: 3033, // push socket port
  port2: 3034, // pull socket port
  port3: 3035, // publisher socket port
  timeout_ms: 1000 // wait for messages from server until timeout
});
context.init();

exports.printContext = () => {
  console.log(context);
}

Второе соединение, файл s.js

// удаление информации о подключении библиотеки из require.cache
Object.keys(require.cache || {}).forEach((x) => {
  if (x.includes('mql5-connector-js')) {
    delete require.cache[x];
  }
});

const { ConfigContext, SymbolInfo } = require('mql5-connector-js')

const context = new ConfigContext({
  host_ip: "127.0.0.1", // server ip
  protocol: "tcp", // transfer protocol
  port1: 3036, // push socket port
  port2: 3037, // pull socket port
  port3: 3038, // publisher socket port
  timeout_ms: 1000 // wait for messages from server until timeout
});
context.init();

exports.printContext = () => {
  console.log(context);
}

Первое и второе соединение в файле index.js

const first = require('./f');
const second = require('./s');

console.log('FIRST');
first.printContext();
console.log('SECOND');
second.printContext();
process.exit(0);

Результат запуска

введите сюда описание изображения

→ Ссылка