Почему этот объект карты отображается пустым при попытке доступа к нему?Javascript

Форум по Javascript
Ответить
Anonymous
 Почему этот объект карты отображается пустым при попытке доступа к нему?

Сообщение Anonymous »

Давно слушаю, звоню впервые... буду признателен за любую помощь, потому что я в растерянности!
Я работаю над проектом node.js, используя libp2p для обнаружения одноранговых узлов . Моя кодовая база работает на двух машинах, подключенных к моей локальной сети. Они обнаруживают друг друга, подключаются друг к другу и сохраняют сведения о соединении в объекте Map, называемом DiscoverPeers. У меня есть несколько операторов журнала консоли для отслеживания значения DiscoverPeers. Карта содержит именно то, что я ожидал, пока я не попытаюсь получить доступ к этому объекту карты из дополнительного модуля. Затем он сразу же показывает, что он пуст, несмотря на то, что оператор журнала непосредственно перед этим показывает, что он содержит 3 записи.
Соответствующие модули:
peerState - Объявляет обнаруженную карту сверстников

Код: Выделить всё

console.log('Initializing peerState...');

export const discoveredPeers = new Map();
export const connectedPeers = new Map();
peerStateManager — импортирует PeerState, в котором объявлен объект DiscoverMaps. Содержит различные методы получения/установки для PeerState

Код: Выделить всё

export const getAllDiscoveredPeers = async () => discoveredPeers;

export  const updatePeerPublicKey = async (peerId, publicKey) => {
if (discoveredPeers.has(peerId)) {
discoveredPeers.get(peerId).publicKey = publicKey;
console.log('Updated peer publicKey');
console.log('Discovered Peers @ updatePeerPublicKey: ', discoveredPeers)
}
};

export  const getPeerByPublicKey = async (publicKey) => {
console.log('Discovered Peers @ getPeerByPublicKey:', discoveredPeers);
for (const [peerId, peerData] of discoveredPeers) {
if (peerData.publicKey === publicKey) {
return {peerId, ...peerData}; // Return the whole peer object
}
}
return null; // Return null if no peer with that publicKey is found
};
messenger — импортирует PeerStateManager для доступа и обновления значений PeerState

Код: Выделить всё

case MESSAGE_TYPES.PEER.RESPONSE:
console.log('Received PEER_RESPONSE');
if (message.actionType === ACTION_TYPES.PEER.RESPONSE_PUBLIC_KEY) {
console.log('Received PEER_RESPONSE_PUBLIC_KEY: ', message.payload.publicKey);
const peerId = message.meta.sender;
const publicKey = message.payload.publicKey;
**await peerStateManager.updatePeerPublicKey(peerId, publicKey);**
}
break;
synapseController — импортирует getAllDiscoveredPeers и getPeerByPublicKey из PeerStateManager

Код: Выделить всё

exports.getSynapseUserPosts = async (req, res) => {
**console.log('Discovered Peers in getSynapseUserPosts: ', await getAllDiscoveredPeers());**
const handle = req.query.handle;
const synapsePublicKey = req.query.publicKey;
const {peerId} = await getPeerByPublicKey(synapsePublicKey);

...more definition

}
Вызов из мессенджера заставляет PeerStateManager обновить обнаруженные Peers. Он регистрирует 3 записи в DiscoverPeers. Сразу после этого вызов getAllDiscoveredPeers() через SynapseController показывает его пустым, что впоследствии приводит к сбою getPeerByPublicKey().
CONSOLE OUTPUT:

Код: Выделить всё

Updated peer publicKey
Discovered Peers @ updatePeerPublicKey:  Map(3) {
'12D3KooWM2YGTyBb11aPdWHbDarzpmDLp3FpAPQbqFKHWjAtJrpm' => {
publicKey: '0315e1f282db55a243b70c8030dc4e4a1fe9fff45dbe82f1e5f1ae6638b6e3ff49',
multiaddrs: [
'/ip4/192.168.1.188/tcp/4001'
]
},
'12D3KooWJtLJ3Z5YM855gxsWDnEFHhATAPTGMBQDQGYjh3icFsbs' => {
publicKey: null,
multiaddrs: [
'/ip4/192.168.1.253/tcp/4001/p2p/12D3KooWJtLJ3Z5YM855gxsWDnEFHhATAPTGMBQDQGYjh3icFsbs'
]
},
'12D3KooWEESBm7xFdo35dGnbjY5LZVnWvbn1JS51Kc71ooGkcWNr' => {
publicKey: null,
multiaddrs: [
'/ip4/192.168.1.188/tcp/4001/p2p/12D3KooWEESBm7xFdo35dGnbjY5LZVnWvbn1JS51Kc71ooGkcWNr'
]
}
}
Discovered Peers in getSynapseUserPosts:  Map(0) {}
Discovered Peers @ getPeerByPublicKey: Map(0) {}
/Users/enki/Developer/Repositories (Version Controlled)/meNexus-platform/synapse/api/src/controllers/synapseController.js:14
const {peerId} = await getPeerByPublicKey(synapsePublicKey);
^

TypeError: Cannot destructure property 'peerId' of '(intermediate value)' as it is null.

Я попробовал объявить обнаруженные Peers в отдельном файле, который управляется модулем peerStateManager, потому что некоторые из моих прочитанных данных предполагали, что обнаруженные Peers повторно инициализировались, когда SynapseController пытался получить доступ к карте, потому что файл был импортирован снова... поэтому я постарался убедиться, что DiscoverPeers является глобальным/одноэлементным объектом. То же самое поведение сохраняется, когда карта отображается пустой, как только SynapseController пытается получить к ней доступ. У меня также есть оператор журнала в PeerState, который показывает («Инициализация PeerState...») и срабатывает только один раз. Я не вижу повторного срабатывания, когда SynapseController пытается получить доступ к обнаруженной карте одноранговых узлов.
Буду очень признателен за любую помощь, так как я просто застрял на этой карте.
Я счастлив при необходимости ответить на уточняющие вопросы. Я изо всех сил пытаюсь задать свой вопрос изящно, поэтому заранее извиняюсь, если мой пост будет тарабарщиной. Спасибо.

Подробнее здесь: https://stackoverflow.com/questions/793 ... -access-it
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Javascript»