Написание функций
Узел Function позволяет выполнять код JavaScript для сообщений, которые проходят через него.
Сообщение передается узлу как объект с именем msg
.
#
Написание функцииКод в узле Function представляет собой тело функции. Самая простая функция, возвращающая полученное сообщение как есть:
Если функция возвращает null
, тогда сообщение не передается следующим узлам, и поток завершается.
Функция всегда должна возвращать объект msg
. Возврат числа или строки приведет к ошибке.
Возвращаемый объект сообщения не обязательно должен быть тем же объектом, что был получен узлом; функция может создать совершенно новый объект перед его возвращением. Например:
Примечание
Создание нового объекта сообщения приведет к потере свойств полученного сообщения. В некоторых случаях это нарушит выполнение потока. Например, поток, состоящий из узлов HTTP In и HTTP Response требует, чтобы свойства msg.req
и msg.res
были переданы от одного узла - другому. Как правило, узлы Function должны вносить необходимые изменения в переданный им объект сообщения и возвращать его.
#
Несколько выходовОкно редактирования функции позволяет изменять количество выходов. При наличии более одного выхода, функция может вернуть массив сообщений для отправки на те или иные выходы.
Это позволяет писать функции, отправляющие сообщения на разные выходы в зависимости от каких-то условий. Например, эта функция будет отправлять все сообщения, у которых значение points
больше 100 на второй выход, а все остальные - на первый:
В следующем примере исходное сообщение передается как есть на первый выход, а сообщение, содержащее id
пользователя, передается на второй выход:
#
Несколько сообщенийФункция может отправить сразу несколько сообщений на любой выход, возвращением массива сообщений внутри возвращаемого массива. Когда для выхода возвращается несколько сообщений, последующие узлы получат сообщения по очереди в том порядке, в котором они были возвращены.
В следующем примере msg1
, msg2
, msg3
будут отправлены на первый выход, а msg4
будет отправлен на второй выход.
В следующем примере текст из свойства msg.text
разбивается на отдельные слова, и для каждого слова возвращается сообщение, в котором свойству msg.word
присвоено это слово.
#
Асинхронная отправка сообщенийЕсли функция выполняет какое-то асинхронное действие перед отправкой сообщения, она не может вернуть сообщение в конце.
Вместо этого она должна использовать функцию node.send()
, передав ей аргументом сообщение(я) для отправки, в том же виде, как было описано в предыдущих разделах.
Например:
Узел Function клонирует каждый объект сообщения, который вы передаете в node.send
, чтобы гарантировать отсутствие непреднамеренной модификации объектов сообщения, которые продолжают использоваться внутри функции.
Функция может запросить среду выполнения не клонировать первое сообщение переданное в node.send
, установив false
в качестве второго аргумента функции. Это полезно, если сообщение содержит что-то, что не может быть клонировано, или из соображений производительности, чтобы минимизировать накладные расходы на отправку сообщений:
#
Завершение обработки сообщенияЕсли узел Function выполняет асинхронную работу с сообщением, то среда выполнения не может автоматически определить, когда узел завершит его обработку.
Чтобы помочь ей в этом, узел Function должен вызывать node.done()
после завершения обработки сообщения. Это позволит среде выполнения правильно отслеживать сообщения в системе.
#
Выполнение кода на стартеВ настройках узла Function есть вкладка Настройка, на которой можно ввести код, который будет выполняться при запуске сервера или при развертывании новой конфигурации потока. Это можно использовать для предустановки какого-то состояния, требуемого для работы узла Function.
Например, это может быть установка первоначального значения в локальном контексте, который будет затем использоваться основной функцией:
Настройка может возвращать Promise, если ей необходимо выполнить асинхронную работу, прежде чем основная функция сможет начать обработку сообщений. Любые сообщения, поступающие до завершения функции настройки, будут помещены в очередь и обработаны, когда настройка завершится.
#
ЧисткаЕсли вы используете асинхронные функции обратного вызова (callback) в своих функциях, вам может потребоваться очистка всех невыполненных запросов или закрытие любых соединений, при переразвертывании запущенного потока. Вы можете сделать это двумя разными способами.
Либо добавлением обработчика события close
:
Или вы можете добавить код на вкладке Закрытие в окне редактирования узла.
#
Ведение журнала событийЕсли во время работы узла нужно что-то записать в системную консоль (журнал среды выполнения), можно использовать одну из следующих функций:
Сообщения, отправляемые функциями warn
и error
, также отправляются на боковую панель отладки.
Для более подробных сведений в журнале событий, есть также node.trace()
и node.debug()
.
#
Обработка ошибокЕсли функция обнаруживает ошибку, которая должна прервать текущий поток, она ничего не должна возвращать. Чтобы запустить узел Catch на той же вкладке, функция должна вызвать node.error
с исходным сообщением в качестве второго аргумента:
#
Хранение данныхПомимо msg
объекта, функция также может хранить данные в хранилище контекста.
Более подробную информацию о контексте в Ботодроме можно найти на странице «работа с контекстом».
В узле Function есть три предопределенные переменные, которые могут использоваться для доступа к контексту:
context
- локальный контекст узлаflow
- контекст с потоковой областью видимостиglobal
- контекст с глобальной областью видимости
В следующих примерах используется flow
контекст, но они также применимы к context
и global
.
Чтобы получить значение из контекста:
Чтобы установить значение:
В следующем примере ведется подсчет количества запусков функции:
#
Получение / установка нескольких значенийТакже можно получить или установить несколько значений одним обращением:
В этом случае любые отсутствующие значения будут устанавлены в null
.
#
Несколько хранилищ контекстаПо умолчанию функции контекста get
/set
используют хранилище file
. Последним аргументом функции можно указать другое хранилище для получения/установки значения, например, memory
:
#
Добавление статусаУзел Function может показывать свое состояние (статус) так же, как и другие узлы. Чтобы установить статус, вызовите функцию node.status
. Например:
Любые изменения статуса можно будет затем также перехватывать узлом Status.
#
Параметры объекта статусаУ объекта статуса могут быть три свойства: fill
, shape
и text
.
Первые два определяют внешний вид значка состояния, а третий - необязательный короткий текст (менее 20 символов), отображаемый рядом со значком.
Свойство shape
(форма) может быть: ring
(кольцо) или dot
(точка).
Свойство fill
(заливка) может быть: red
(красный), green
(зеленый), yellow
(желтый), blue
(синий) или grey
(серый).
Если объект статуса - пустой объект {}
, тогда статус узла будет удален.
#
Справочник APIВ узле Function доступны следующие объекты.
node
#
node.id
- идентификатор узла Functionnode.name
- имя узла Functionnode.log(..)
- записать сообщение в журналnode.warn(..)
- записать предупреждающее сообщение в журналnode.error(..)
- записать сообщение об ошибке в журналnode.debug(..)
- записать отладочное сообщение в журналnode.trace(..)
- записать сообщение трассировки в журналnode.on(..)
- зарегистрировать обработчик событийnode.status(..)
- обновить статус узлаnode.send(..)
- отправить сообщение последующим узламnode.done(..)
- завершить обработку сообщения
context
#
context.get(..)
- получить значение свойства локального контекста узлаcontext.set(..)
- установить значение для свойства локального контекста узлаcontext.keys()
- получить список всех свойств локального контекста узлаcontext.flow
- то же самое, что иflow
context.global
- то же самое, что иglobal
flow
#
flow.get(..)
- получить свойство контекста с потоковой областью видимостиflow.set(..)
- установить свойство контекста с потоковой областью видимостиflow.keys()
- получить список всех свойств контекста с потоковой областью видимости
global
#
global.get(..)
- получить свойство контекста с глобальной областью видимостиglobal.set(..)
- установить свойство контекста с глобальной областью видимостиglobal.keys()
- получить список всех свойств контекста с глобальной областью видимости
env
#
env.get(..)
- получить значение переменной среды
#
Другие модули и функцииВ узле Function также доступны следующие модули и функции:
Buffer
- Node.js-модульBuffer
console
- Node.js-модульconsole
(node.log
более предпочтительный метод для ведения журнала)util
- Node.js-модульutil
setTimeout
/clearTimeout
- функции тайм-аута javascript.setInterval
/clearInterval
- функции интервального таймера javascript.
Примечание
Узел Function автоматически очищает все незавершенные тайм-ауты (setTimeout) или интервальные таймеры (setInterval) при остановке или повторном развертывании.
Также в узле Function есть опциональный Node.js-модуль crypto
, который можно подключить при необходимости с помощью функции require
в глобальном контексте: global.get("require")(..)
. Пример кода для подключения модуля crypto
: