Node-RED:Руководство пользователя/Работа с контекстными данными

Материал из Онлайн справочника
Перейти к: навигация, поиск

Перевод: Максим Кузьмин (Cubewriter)
Перевел 46623 статей для сайта.

Контакты:

Проверка/Оформление/Редактирование: Мякишев Е.А.


Pixel Art Mini Meow Animated.gif Черновик


Работа с контекстными данными[1]

Что такое контекст?

В редакторе Node-RED есть возможность сохранять информацию и обмениваться ею между разными нодами, не используя для этого сообщения, идущие по потоку. Это называется «контекстом».

Области действия контекстных данных

От области действия того или иного контекстного значения зависит то, кто еще будет «видеть» это значение. Существует три области действия контекста (контекстных уровня):

  • Уровень ноды – значение будет видеть только та нода, что задала это значение
  • Уровень потока – значение будут видеть все ноды в том же потоке (на той же вкладке редактора Node-RED)
  • Глобальный уровень – значение будет видно всем нодам

Выбор области действия для значения зависит от того, как оно будет использоваться.

Если доступ к этому значению нужен только одной ноде – вроде ноды «Function» – то здесь вполне хватит контекста ноды.

Но чаще случается, когда контекст используется для обмена каким-либо значением между несколькими разными нодами. К примеру, у вас может быть датчик, регулярно публикующий новые значения в один поток, но вам также нужно создать другой HTTP-поток, возвращающий самое последнее значение от этого датчика. Соответственно, если мы сохраним это значение датчика в контекст, то HTTP-поток сможет вернуть это значение.

Глобальный контекст можно предварительно настроить при помощи свойства «functionGlobalContext» в файле настроек.

Pixel Art Mini Meow Animated.gif

Примечание: Если речь о нодах подпотока, то для них контекстом потока будет контекст их подпотока, но не контекст потока, частью которого является этот подпоток. Впрочем, в Node-RED версии 0.20 появилась возможность сделать так, чтобы ноды подпотока могли получить доступ к контексту родительского потока. Для этого перед ключом контекста нужно вписать «$parent.»:

var colour = flow.get("$parent.colour");


Хранилища контекстных данных

По умолчанию контекстные данные хранятся только в памяти. Это значит, что данные контекста удаляются с каждым перезапуском Node-RED. Но начиная с версии 0.19 в Node-RED появилась возможность сохранять данные контекста, благодаря чему они останутся в целости и сохранности даже после перезапуска редактора.

То, как будут храниться контекстные данные, можно задать в свойстве «contextStorage» в файле настроек «settings.js».

В Node-RED для этого имеются два встроенных модуля: «memory» и «localfilesystem». Также можно создавать собственные хранилища-плагины для хранения данных где угодно.

Сохранение контекстных данных в файловую систему

Чтобы сохранять контекстные данные в файловую систему, можно использовать вот эту опцию:

contextStorage: {
   default: {
       module: "localfilesystem"
   }
}

С помощью этой настройки мы задаем, что хранилищем контекстных данных по умолчанию будет экземпляр плагина «localfilesystem» со всеми его настройками по умолчанию. Это значит, что...

  • Он будет сохранять контекстные данные в директорию «~/.node-red/context/»
  • Он будет кэшировать данные в память, а в файловую систему будет записывать их только каждые 30 секунд
Pixel Art Mini Meow Animated.gif

Примечание: От того, когда вы установили Node-RED зависит, будет ли в файле «settings.js» свойство «contextStorage» или нет. Если нет, вы можете скопировать его из фрагмента выше и самостоятельно вставить в файл «settings.js».


Использование нескольких контекстных хранилищ

Вы можете настроить несколько контекстных хранилищ, что позволит вам сохранять одни значения в локальную файловую систему, а другие – только в память. К примеру, чтобы хранилищем контекстных данных по умолчанию была только память, а вторым хранилищем – файловая система, в файле «settings.js» можно задать следующее:

contextStorage: {
   default: "memoryOnly",
   memoryOnly: { module: 'memory' },
   file: { module: 'localfilesystem' }
}

Во фрагменте выше свойство «default» говорит Node-RED, какое хранилище использовать, если при запросе доступа к контексту не будет указано, какое именно хранилище нужно использовать.

Pixel Art Mini Meow Animated.gif

Примечание: Если вы решили задать несколько хранилищ «localfilesystem», вам также обязательно нужно будет задать для них настройку «dir», чтобы они использовали разные директории для хранения данных. О том, как настраивать хранилища, читайте тут.


Более подробно о встроенных модулях, их настройках и о том, как создавать собственные модули, читайте здесь.

Использование контекста в потоке

Самый простой способ сохранить значение в контекст – при помощи ноды «Change». К примеру, ниже показаны настройки для ноды «Change» для сохранения значения «msg.payload» в контекст «flow» с ключом «myData».

Nodered context change.png

Некоторые ноды могут получить доступ к контексту напрямую. Например, ноду «Inject» можно настроить на отправку контекстного значения, а нода «Switch» может направлять значения по разным маршрутам в зависимости от того, какое значение хранится в контексте.

Если у вас настроено несколько контекстных хранилищ, в этом меню вы также сможете выбрать, в какое именно хранилище вы хотите сохранить свое значение.

Nodered context change multiple stores.png

Использование контекста в ноде «Function»

О том, как использовать контекст в ноде «Function», описывается в этой статье.

Использование контекста в ноде, созданной вами

О том, как использовать контекст в ноде, созданной вами, читайте в этой статье.

Удаление контекста из файлового хранилища

Контекстные данные можно навсегда удалить при помощи настройки «Delete» в ноде «Change».

Nodered context delete.png

См.также

Внешние ссылки

  1. nodered.org - Working with context