помогите разобратся с экземплярами класса
Я использую 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 "создаётся" соединение с внешним сервисом, но если до этого соединение было создано - оно переиспользуется и при этом переданные параметры соединения игнорируются.
Я могу предложить два способа как изменить такое поведение библиотеки:
- форкнуть проект и написать иначе код, мешающий созданию второго соединения
- перед созданием второго соединения выкинуть из памяти 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);
