Я использую 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
в клиентском объекте.
У меня есть два вопроса.
Я новичок в MQTT, поэтому извините, если вопросы слишком наивны :)
Моя ошибка. console.info(клиент) печатает undefined. Это означает, что я не могу получить доступ к объекту клиента в опубликованном обратном вызове.
client.decoded_token
Если вы используете vs code или Webstrom для разработки, вы можете использовать встроенный отладчик для отладки и печати клиентского объекта.
WRT ваш пункт 2, вы говорите, что я не могу получить доступ к decoded_token от клиента, когда клиент публикует в теме? Моя идея состоит в том, чтобы хранить параметры датчика в токене, чтобы я мог читать данные и параметры всякий раз, когда датчик публикует информацию в своей теме.
client - это просто собственный объект JS, который передается по ссылке, поэтому, если вы добавляете decoded_token в другое промежуточное ПО/функцию, он должен быть доступен в следующем, поэтому приведенный выше код должен работать, однако console.info(client.decoded_token) Я использую console.info(client), он работает, и я вижу decoded_token не имеет смысла. Не могли бы вы войти в консоль вместе и посмотреть?