Как получить доступ к клиентскому объекту в «опубликованном» обратном вызове?

Я использую Mosca в качестве встроенного брокера MQTT с бэкендом mosquito. Я использую Mosca в первую очередь как механизм аутентификации, который может считывать токены jwt и извлекать из них некоторые значения. Я создал свои собственные авторизаторы для чтения токена JWT в поле пароля mqtt и его декодирования/проверки. После декодирования я добавляю декодированные поля в клиентский объект, как показано ниже.

authenticate(client, username, password, next) {
    try {
        const decoded_token = jwt.verify(password.toString(), process.env.SECRET_KEY_BASE);
        client.decoded_token = decoded_token;
        next(null, true);
    } catch(error) {
        console.info('name: %s, error: %s', error.name, error.message);
        console.info('unauthorized!');
        next(null, false);
    }
}

Я хочу получить доступ к значению decoded_token в обратном вызове published, как показано ниже

broker.on('published', (packet, client) => {
    console.info(client.decoded_token);
    console.info('Published', packet.topic, packet.payload);

});

Почему-то приведенный выше код не работает должным образом. Я получаю следующую ошибку:

TypeError: невозможно прочитать свойство decoded_token неопределенного

В то время как если вместо console.info(client.decoded_token) я использую console.info(client), это работает, и я вижу значение decoded_token в клиентском объекте.

У меня есть два вопроса.

  1. Почему приведенный выше код не работает?
  2. Когда я сохраняю значение в клиентском объекте, передается ли значение клиенту (датчику), которое он может отправить с последующими запросами, или оно сохраняется только в локальной памяти?

Я новичок в MQTT, поэтому извините, если вопросы слишком наивны :)

client - это просто собственный объект JS, который передается по ссылке, поэтому, если вы добавляете decoded_token в другое промежуточное ПО/функцию, он должен быть доступен в следующем, поэтому приведенный выше код должен работать, однако console.info(client.decoded_token) Я использую console.info(client), он работает, и я вижу decoded_token не имеет смысла. Не могли бы вы войти в консоль вместе и посмотреть?

AZ_ 08.04.2019 08:58

Моя ошибка. console.info(клиент) печатает undefined. Это означает, что я не могу получить доступ к объекту клиента в опубликованном обратном вызове.

Rahul 08.04.2019 09:45
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
96
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
  1. Если вы можете получить переменную decoded_token в клиентском объекте. Тогда мы можем доступ к нему через

client.decoded_token

Если вы используете vs code или Webstrom для разработки, вы можете использовать встроенный отладчик для отладки и печати клиентского объекта.

  1. Вы не можете передать значение в клиентский объект для следующего вызова.

WRT ваш пункт 2, вы говорите, что я не могу получить доступ к decoded_token от клиента, когда клиент публикует в теме? Моя идея состоит в том, чтобы хранить параметры датчика в токене, чтобы я мог читать данные и параметры всякий раз, когда датчик публикует информацию в своей теме.

Rahul 08.04.2019 09:25

Другие вопросы по теме