1
0
mirror of https://github.com/node-red/node-red.git synced 2023-10-10 13:36:53 +02:00

Merge branch 'master' into dev

This commit is contained in:
Nick O'Leary 2021-01-27 23:28:19 +00:00
commit 3a0074d96e
No known key found for this signature in database
GPG Key ID: 4F2157149161A6C9
44 changed files with 285 additions and 226 deletions

View File

@ -96,7 +96,7 @@
"grunt-jsdoc": "2.4.1", "grunt-jsdoc": "2.4.1",
"grunt-jsdoc-to-markdown": "5.0.0", "grunt-jsdoc-to-markdown": "5.0.0",
"grunt-jsonlint": "2.1.3", "grunt-jsonlint": "2.1.3",
"grunt-mkdir": "~1.0.0", "grunt-mkdir": "~1.1.0",
"grunt-npm-command": "~0.1.2", "grunt-npm-command": "~0.1.2",
"grunt-sass": "~3.1.0", "grunt-sass": "~3.1.0",
"grunt-simple-mocha": "~0.4.1", "grunt-simple-mocha": "~0.4.1",

View File

@ -39,9 +39,12 @@ module.exports = {
}, },
get: function(req,res) { get: function(req,res) {
var namespace = req.params[0]; var namespace = req.params[0];
var lngs = req.query.lng;
namespace = namespace.replace(/\.json$/,""); namespace = namespace.replace(/\.json$/,"");
var lang = req.query.lng || i18n.defaultLang; //apiUtil.determineLangFromHeaders(req.acceptsLanguages() || []); var lang = req.query.lng || i18n.defaultLang; //apiUtil.determineLangFromHeaders(req.acceptsLanguages() || []);
if (/[^a-z\-\*]/i.test(lang)) {
res.json({});
return;
}
var prevLang = i18n.i.language; var prevLang = i18n.i.language;
// Trigger a load from disk of the language if it is not the default // Trigger a load from disk of the language if it is not the default
i18n.i.changeLanguage(lang, function(){ i18n.i.changeLanguage(lang, function(){

View File

@ -246,8 +246,8 @@
"import": { "import": {
"import": "Импортировать в", "import": "Импортировать в",
"importSelected": "Импортировать выбранные", "importSelected": "Импортировать выбранные",
"importCopy": "Импортировать копию", "importCopy": "Импортировать копии",
"viewNodes": "Посмотреть узлы...", "viewNodes": "Показать узлы...",
"newFlow": "новый поток", "newFlow": "новый поток",
"replace": "заменить", "replace": "заменить",
"errors": { "errors": {
@ -257,7 +257,7 @@
"missingType": "Недопустимый поток - у элемента __index__ отсутствует свойство 'type'" "missingType": "Недопустимый поток - у элемента __index__ отсутствует свойство 'type'"
}, },
"conflictNotification1": "Некоторые импортируемые Вами узлы уже существуют в рабочей области.", "conflictNotification1": "Некоторые импортируемые Вами узлы уже существуют в рабочей области.",
"conflictNotification2": "Выберите, какие узлы импортировать и следует ли заменить существующие узлы или импортировать их копию." "conflictNotification2": "Выберите, какие узлы импортировать и следует ли заменить ими существующие узлы или импортировать их копии."
}, },
"copyMessagePath": "Путь скопирован", "copyMessagePath": "Путь скопирован",
"copyMessageValue": "Значение скопировано", "copyMessageValue": "Значение скопировано",
@ -373,12 +373,12 @@
"configAdd": "Добавить", "configAdd": "Добавить",
"configUpdate": "Обновить", "configUpdate": "Обновить",
"configDelete": "Удалить", "configDelete": "Удалить",
"nodesUse": "__count__ узел использует эту конфигурацию", "nodesUse": "__count__ узел использует этот конфиг",
"nodesUse_plural_2": "__count__ узла используют эту конфигурацию", "nodesUse_plural_2": "__count__ узла используют этот конфиг",
"nodesUse_plural_5": "__count__ узлов используют эту конфигурацию", "nodesUse_plural_5": "__count__ узлов используют этот конфиг",
"addNewConfig": "Добавить новый конфигурационный узел __type__", "addNewConfig": "Добавить новый конфиг узел __type__",
"editNode": "Изменить узел __type__", "editNode": "Изменить узел __type__",
"editConfig": "Изменить конфигурационный узел __type__", "editConfig": "Изменить конфиг узел __type__",
"addNewType": "Добавить новый __type__...", "addNewType": "Добавить новый __type__...",
"nodeProperties": "свойства узла", "nodeProperties": "свойства узла",
"label": "Метка", "label": "Метка",
@ -615,7 +615,7 @@
"info": { "info": {
"name": "Информация", "name": "Информация",
"tabName": "Имя", "tabName": "Имя",
"label": "сведения", "label": "инфо",
"node": "Узел", "node": "Узел",
"type": "Тип", "type": "Тип",
"group": "Группа", "group": "Группа",
@ -648,8 +648,8 @@
"showTips":"Вы можете открыть советы из панели настроек", "showTips":"Вы можете открыть советы из панели настроек",
"outline": "Структура", "outline": "Структура",
"empty": "пусто", "empty": "пусто",
"globalConfig": "Узлы глобальной конфигурации", "globalConfig": "Глобальные конфиг узлы",
"triggerAction": "Запустить действие", "triggerAction": "Вызвать действие",
"find": "Найти в рабочей области", "find": "Найти в рабочей области",
"search": { "search": {
"configNodes": "Узлы конфигурации", "configNodes": "Узлы конфигурации",
@ -671,8 +671,8 @@
}, },
"config": { "config": {
"name": "Узлы конфигураций", "name": "Узлы конфигураций",
"label": "конфигурация", "label": "конфиг",
"global": "На всех потока", "global": "На всех потоках",
"none": "нет", "none": "нет",
"subflows": "подпотоки", "subflows": "подпотоки",
"flows": "потоки", "flows": "потоки",
@ -690,8 +690,8 @@
"none": "ничего не выбрано", "none": "ничего не выбрано",
"refresh": "обновите, чтобы загрузить", "refresh": "обновите, чтобы загрузить",
"empty": "пусто", "empty": "пусто",
"node": "Узел", "node": "Узловой",
"flow": "Поток", "flow": "Потоковый",
"global": "Глобальный", "global": "Глобальный",
"deleteConfirm": "Вы уверены, что хотите удалить этот элемент?", "deleteConfirm": "Вы уверены, что хотите удалить этот элемент?",
"autoRefresh": "Обновить при изменении выбора", "autoRefresh": "Обновить при изменении выбора",
@ -877,7 +877,7 @@
"bool": "логический тип", "bool": "логический тип",
"json": "JSON", "json": "JSON",
"bin": "буфер", "bin": "буфер",
"date": "отметка времени", "date": "метка времени",
"jsonata": "выражение", "jsonata": "выражение",
"env": "переменная среды", "env": "переменная среды",
"cred": "учетные данные" "cred": "учетные данные"

View File

@ -401,7 +401,8 @@ RED.palette = (function() {
RED.workspaces.show(nt.substring(8)); RED.workspaces.show(nt.substring(8));
e.preventDefault(); e.preventDefault();
}); });
nodeInfo = RED.utils.renderMarkdown(def.info||""); var subflow = RED.nodes.subflow(nt.substring(8));
nodeInfo = RED.utils.renderMarkdown(subflow.info||"");
} }
setLabel(nt,d,label,nodeInfo); setLabel(nt,d,label,nodeInfo);

View File

@ -15,6 +15,9 @@
**/ **/
body {
overflow: hidden;
}
.red-ui-editor { .red-ui-editor {
font-size: $primary-font-size; font-size: $primary-font-size;

View File

@ -737,7 +737,10 @@ module.exports = function(RED) {
group.msg = Object.assign(group.msg, msg); group.msg = Object.assign(group.msg, msg);
group.send = send; group.send = send;
var tcnt = group.targetCount; var tcnt = group.targetCount;
if (msg.hasOwnProperty("parts")) { tcnt = group.targetCount || msg.parts.count; } if (msg.hasOwnProperty("parts")) {
tcnt = group.targetCount || msg.parts.count;
group.targetCount = tcnt;
}
if ((tcnt > 0 && group.currentCount >= tcnt) || msg.hasOwnProperty('complete')) { if ((tcnt > 0 && group.currentCount >= tcnt) || msg.hasOwnProperty('complete')) {
completeSend(partId); completeSend(partId);
} }
@ -759,3 +762,4 @@ module.exports = function(RED) {
} }
RED.nodes.registerType("join",JoinNode); RED.nodes.registerType("join",JoinNode);
} }

View File

@ -16,7 +16,7 @@
<script type="text/html" data-help-name="inject"> <script type="text/html" data-help-name="inject">
<p> <p>
Запускает сообщение в поток вручную или через равные промежутки времени. Данные сообщения могут быть различных типов, включая строку, объект JavaScript или текущее время. Вбрасывает сообщение в поток вручную или через равные промежутки времени. Данные в сообщении могут быть различных типов, включая строку, объект JavaScript или метку текущего времени.
</p> </p>
<h3>Выводит</h3> <h3>Выводит</h3>
@ -29,26 +29,24 @@
<h3>Подробности</h3> <h3>Подробности</h3>
<p> <p>
Узел Inject может инициировать поток с определенными данными (значение payload). Данные по умолчанию - это отметка текущего времени в миллисекундах с 1 января 1970 года. Узел Inject может инициировать выполнение потока с определенными данными (значение payload). Данные по умолчанию - это метка текущего времени в миллисекундах, прошедших с 1 января 1970 года.
</p> </p>
<p> <p>
Узел также поддерживает вывод строк, чисел, логических значений, объектов JavaScript или значений потоковых/глобальных контекстов. Узел также поддерживает вывод строк, чисел, логических значений, объектов JavaScript или значений потоковых/глобальных контекстов.
</p> </p>
<p> <p>
По умолчанию узел запускается вручную при нажатии на его кнопку в редакторе. Его также можно настроить для автоматического запуска через равные промежутки времени или по расписанию. По умолчанию узел запускается вручную при нажатии его кнопки в редакторе. Его также можно настроить на автоматический запуск через равные промежутки времени или по расписанию.
</p> </p>
<p> <p>
Он также может быть настроен так, чтобы делать вывод один раз при каждом запуске потоков. Он также может быть настроен однократный вброс сообщения при каждом (пере)запуске потоков.
</p> </p>
<p> <p>
Максимальный <i>интервал</i>, который можно указать, составляет около 596 часов / 24 дней. Однако если Вам нужны интервалы, превышающие один день, Вам следует рассмотреть возможность использования узла планировщика, который может работать с перебоями электроэнергии и перезапусками. Максимальный <i>интервал</i>, который можно указать, составляет около 596 часов / 24 дней. Однако если Вам нужны интервалы, превышающие один день, Вам следует рассмотреть возможность использования функций планировщика в узле, которые смогут корректно работать с перебоями электроэнергии и перезапусками.
</p> </p>
<p> <p>
<b>Примечание</b>: В параметрах <i>"с интервалом в промежутке"</i> и <i>"в определенное время"</i> используется стандартная система cron. <b>Примечание</b>: В параметрах <i>"с интервалом в промежутке"</i> и <i>"в определенное время"</i> используется стандартная система "cron". Это означает, что "20 минут" будут в следующем часу, 20 минут спустя и 40 минут спустя - а не через 20 минут. Если нужен вброс сообщений каждые 20 минут - используйте параметр <i>"с интервалом"</i>.
Это означает, что 20 минут будут в следующем часу, 20 минут спустя и 40 минут спустя - а не через 20 минут.
Если нужно каждые 20 минут - используйте параметр <i>"с интервалом"</i>.
</p> </p>
<p> <p>
<b>Примечание</b>: Чтобы включить многострочный текст в строковое значение, необходимо использовать узел Function для создания данных. <b>Примечание</b>: Чтобы включить многострочный текст в строковое значение, необходимо использовать узел Function для формирования данных.
</p> </p>
</script> </script>

View File

@ -16,24 +16,24 @@
<script type="text/html" data-help-name="debug"> <script type="text/html" data-help-name="debug">
<p> <p>
Отображает выбранные свойства сообщения на боковой панели во вкладке отладки и, при необходимости, журнале выполнения. По умолчанию отображается содержимое <code>msg.payload</code>, но его можно настроить для отображения любого свойства, полного сообщения или результата выражения JSONata. Отображает выбранные свойства получаемых узлом сообщения на боковой панели во вкладке отладки и, при необходимости, журнале среды выполнения. По умолчанию отображается содержимое <code>msg.payload</code>, но узел можно настроить на отображение любого свойства, всех свойств сообщения или результата выражения JSONata.
</p> </p>
<h3>Подробности</h3> <h3>Подробности</h3>
<p> <p>
Вкладка отладки на боковой панели обеспечивает структурированное представление отправляемых сообщений, что упрощает понимание их структуры. Вкладка отладки на боковой панели обеспечивает структурированное представление полученных узлом сообщений, что упрощает исследование их структуры.
</p> </p>
<p> <p>
Объекты и массивы JavaScript могут быть свернуты и развернуты по мере необходимости. Буферные объекты могут отображаться в виде сырых данных или как строка, когда это возможно. Объекты и массивы JavaScript могут быть свернуты и развернуты по мере необходимости. Буферы могут отображаться в виде данных как есть или в виде строки, когда это возможно.
</p> </p>
<p> <p>
Рядом с каждым сообщением отладочная панель содержит информацию о времени получения сообщения, узле, который его отправил, и типе сообщения. Рядом с каждым сообщением отладочная панель показывает информацию о времени получения сообщения, узле, который его отправил, и типе данных.
Нажатие на идентификатор узла-источника, показывает этот узел в рабочей области. Нажатие на идентификатор узла-источника покажет этот узел в рабочей области.
</p> </p>
<p> <p>
Кнопка на узле может использоваться для включения или отключения его вывода. Рекомендуется отключать или удалять любые отладочные узлы, которые не используются. Кнопка на узле может использоваться для включения или отключения вывода информации о получаемых сообщениях. Рекомендуется отключать или удалять любые отладочные узлы, которые не используются.
</p> </p>
<p> <p>
Узел также может быть сконфигурирован для отправки всех сообщений в журнал выполнения или для отправки короткого (32 символа) текста в статус под узлом отладки. Узел также может быть настроен на отправку всех сообщений в журнал выполнения или отправку короткого (32 символа) текста в статус под узлом.
</p> </p>
</script> </script>

View File

@ -16,7 +16,7 @@
<script type="text/html" data-help-name="complete"> <script type="text/html" data-help-name="complete">
<p> <p>
Запустить поток, когда другой узел завершит обработку сообщения. Инициирует запуск потока, когда другой узел завершает обработку сообщения.
</p> </p>
<h3>Подробности</h3> <h3>Подробности</h3>
@ -24,12 +24,12 @@
Если узел сообщает среде выполнения о завершении обработки сообщения, этот узел можно использовать для запуска второго потока. Если узел сообщает среде выполнения о завершении обработки сообщения, этот узел можно использовать для запуска второго потока.
</p> </p>
<p> <p>
Например, это можно использовать вместе с узлом без выходного порта, таким как узел Email, для продолжения потока. Например, его можно использовать вместе с узлом, у которого нет выходного порта, таким как узел Email, для продолжения потока.
</p> </p>
<p> <p>
Этот узел должен быть настроен для обработки события выбранных узлов в потоке. В отличие от узла Catch, он не предоставляет режим 'обрабатывать все' для автоматического применения ко всем узлам в потоке. Этот узел должен быть настроен на отслеживание событий выбранных узлов в потоке. В отличие от узла Catch, у него нет режима 'обрабатывать все' для автоматического применения ко всем узлам в потоке.
</p> </p>
<p> <p>
Не все узлы будут инициировать это событие - это будет зависеть от того, была ли в них реализована поддержка этой функции, добавленной в Node-RED 1.0. Не все узлы могут инициировать запуск потока по завршению обработки сообщения. все зависит от того, была ли в них реализована поддержка этой функции, добавленной в Node-RED 1.0, или нет.
</p> </p>
</script> </script>

View File

@ -16,7 +16,7 @@
<script type="text/html" data-help-name="catch"> <script type="text/html" data-help-name="catch">
<p> <p>
Ловит ошибки, выдаваемые узлами на той же вкладке. Ловит ошибки, выбрасываемые узлами на той же вкладке.
</p> </p>
<h3>Выводит</h3> <h3>Выводит</h3>
@ -28,21 +28,21 @@
<dt>error.source.type <span class="property-type">строка</span></dt> <dt>error.source.type <span class="property-type">строка</span></dt>
<dd>тип узла, выдавшего ошибку.</dd> <dd>тип узла, выдавшего ошибку.</dd>
<dt>error.source.name <span class="property-type">строка</span></dt> <dt>error.source.name <span class="property-type">строка</span></dt>
<dd>имя, если установлено, узла, выдавшего ошибку.</dd> <dd>имя узла, выдавшего ошибку, если было настроено.</dd>
</dl> </dl>
<h3>Подробности</h3> <h3>Подробности</h3>
<p> <p>
Если узел выдает ошибку во время обработки сообщения, поток обычно останавливается. Этот узел можно использовать для отлова этих ошибок и обработки их с помощью отдельного потока. Если узел выбрасывает ошибку во время обработки сообщения, поток обычно останавливается. Этот узел можно использовать для отлова и обработки таких ошибок с помощью отдельного потока.
</p> </p>
<p> <p>
По умолчанию узел будет отлавливать ошибки, генерируемые любым узлом на той же вкладке. По желанию он может быть нацелен на определенные узлы или настроен на перехват только тех ошибок, которые не были еще перехвачены 'нацеленным' Catch узлом. По умолчанию узел будет отлавливать ошибки, генерируемые любым узлом на той же вкладке. По желанию он может быть нацелен на определенные узлы или настроен на перехват только тех ошибок, которые не были перехвачены 'нацеленным' Catch узлом.
</p> </p>
<p> <p>
Когда выдается ошибка, все соответствующие Catch узлы получат сообщение. Когда выдается ошибка, все соответствующие Catch узлы получат сообщение.
</p> </p>
<p> <p>
Если ошибка выдается в подпотоке, она будет обработана любыми Catch узлами внутри подпотока. Если таковых нет, ошибка будет распространена до вкладки, на которой находится экземпляр подпотока. Если ошибка выбрасывается в подпотоке, она будет обработана любыми Catch узлами внутри подпотока. Если таковых нет, ошибка будет распространена до вкладки, на которой находится экземпляр подпотока.
</p> </p>
<p> <p>
Если сообщение уже имеет свойство <code>error</code>, оно копируется в <code>_error</code>. Если сообщение уже имеет свойство <code>error</code>, оно копируется в <code>_error</code>.

View File

@ -16,7 +16,7 @@
<script type="text/html" data-help-name="status"> <script type="text/html" data-help-name="status">
<p> <p>
Сообщает о статусах других узлов на той же вкладке. Инициирует запуск потока при изменении статуса других узлов на той же вкладке.
</p> </p>
<h3>Выводит</h3> <h3>Выводит</h3>
@ -28,7 +28,7 @@
<dt>status.source.id <span class="property-type">строка</span></dt> <dt>status.source.id <span class="property-type">строка</span></dt>
<dd>идентификатор узла, сообщившего о статусе.</dd> <dd>идентификатор узла, сообщившего о статусе.</dd>
<dt>status.source.name <span class="property-type">строка</span></dt> <dt>status.source.name <span class="property-type">строка</span></dt>
<dd>имя, если установлено, узла, сообщившего о статусе.</dd> <dd>имя узла, сообщившего о статусе, если настроено.</dd>
</dl> </dl>
<h3>Подробности</h3> <h3>Подробности</h3>
@ -36,6 +36,6 @@
Этот узел не создает <code>payload</code> данные. Этот узел не создает <code>payload</code> данные.
</p> </p>
<p> <p>
По умолчанию узел сообщает о статусах всех узлов на той же вкладке в рабочей области. Его можно настроить для выборочного отчета о статусе отдельных узлов. По умолчанию узел сообщает о статусах всех узлов на той же вкладке в рабочей области. Его можно настроить на выборочное отслеживание статуса только отдельных узлов.
</p> </p>
</script> </script>

View File

@ -21,13 +21,13 @@
<h3>Подробности</h3> <h3>Подробности</h3>
<p> <p>
Этот узел может быть подключен к любому узлу <code>link out</code> на любой вкладке. После подключения они ведут себя так, как если бы они были соединены вместе обычным проводом. Этот узел может быть подключен к любому <code>link out</code> узлу на любой вкладке. После подключения они ведут себя так, как если бы они были соединены вместе обычным проводом.
</p> </p>
<p> <p>
Связи между link-узлами отображаются, только когда выбран link-узел. Если есть какие-либо провода к другим вкладкам, отображается виртуальный узел, по которому можно кликнуть, чтобы перейти на соответствующую вкладку. Связи между link-узлами отображаются, только когда выбран один из соединенных link узлов. Если есть какие-либо провода, ведущие на другие вкладки, они отображаются в виде виртуального узла, по которому можно кликнуть, чтобы перейти на соответствующую вкладку.
</p> </p>
<p> <p>
<b>Примечание:</b> Связи не могут идти внутрь подпотока или изнутри подпотока наружу. <b>Примечание:</b> Провод не может вести внутрь подпотока или изнутри подпотока наружу.
</p> </p>
</script> </script>
@ -38,12 +38,12 @@
<h3>Подробности</h3> <h3>Подробности</h3>
<p> <p>
Узел может быть подключен к любому узлу <code>link in</code> на любой вкладке. После подключения они ведут себя так, как если бы они были соединены вместе обычным проводом. Узел может быть подключен к любому <code>link in</code> узлу на любой вкладке. После подключения они ведут себя так, как если бы они были соединены вместе обычным проводом.
</p> </p>
<p> <p>
Связи между link-узлами отображаются, только когда выбран link-узел. Если есть какие-либо провода к другим вкладкам, отображается виртуальный узел, по которому можно кликнуть, чтобы перейти на соответствующую вкладку. Связи между link-узлами отображаются, только когда выбран один из соединенных link узлов. Если есть какие-либо провода, ведущие на другие вкладки, они отображаются в виде виртуального узла, по которому можно кликнуть, чтобы перейти на соответствующую вкладку.
</p> </p>
<p> <p>
<b>Примечание:</b> Связи не могут идти внутрь подпотока или изнутри подпотока наружу. <b>Примечание:</b> Провод не может вести внутрь подпотока или изнутри подпотока наружу.
</p> </p>
</script> </script>

View File

@ -16,11 +16,11 @@
<script type="text/html" data-help-name="comment"> <script type="text/html" data-help-name="comment">
<p> <p>
Узел, который Вы можете использовать для добавления комментариев к Вашим потокам. Узел, который можно использовать для добавления комментариев к вашим потокам.
</p> </p>
<h3>Подробности</h3> <h3>Подробности</h3>
<p> <p>
Панель редактирования поддерживает синтаксис Markdown. Текст будет отображен как 'описание' на этой информационной вкладке. Окно редактирования поддерживает синтаксис Markdown. Текст будет отображен на информационной вкладке боковой панели в секции 'описание'.
</p> </p>
</script> </script>

View File

@ -16,22 +16,22 @@
<script type="text/html" data-help-name="unknown"> <script type="text/html" data-help-name="unknown">
<p> <p>
Тип этого узла неизвестен Вашему Node-RED. Тип этого узла неизвестен вашему Node-RED.
</p> </p>
<h3>Подробности</h3> <h3>Подробности</h3>
<p> <p>
<i> <i>
Если Вы развернете узел в этом состоянии, его конфигурация будет сохранена, но поток не будет запущен, пока не будет установлен отсутствующий тип. Если вы развернете узел в этом состоянии, его настройки будут сохранены, но поток не будет запущен до тех пор, пока не будет установлен отсутствующий тип.
</i> </i>
</p> </p>
<p> <p>
Используйте опцию <code>Меню - Управление палитрой</code> для поиска и установки узлов или <b>npm install &lt;модуль&gt;</b> для установки любых отсутствующих модулей и перезапустите Node-RED и повторно импортируйте узлы. Используйте опцию <code>Меню - Управление палитрой</code> для поиска и установки узлов или <b>npm install &lt;модуль&gt;</b> для установки отсутствующих модулей. Затем перезапустите Node-RED и повторно импортируйте узлы.
</p> </p>
<p> <p>
Возможно, этот тип узла уже установлен, но отсутствуют какие-то из его зависимостей. Проверьте журнал запуска Node-RED на наличие сообщений об ошибках, связанных с отсутствующим типом узла. Возможно, этот тип узла уже установлен, но отсутствуют какие-то из его зависимостей. Проверьте журнал выполнения Node-RED на наличие сообщений об ошибках, связанных с отсутствующим типом узла.
</p> </p>
<p> <p>
В противном случае Вам следует связаться с автором потока, чтобы получить копию отсутствующего типа узла. В противном случае вам следует связаться с автором потока, чтобы получить отсутствующий тип узла.
</p> </p>
</script> </script>

View File

@ -16,22 +16,22 @@
<script type="text/html" data-help-name="function"> <script type="text/html" data-help-name="function">
<p> <p>
Блок с JavaScript функцией, написанной во вкладке <b>Функция</b>, которая исполняется для сообщений, получаемых узлом. Исполняет JavaScript функцию (введенную в настройках, во вкладке <b>Функция</b>) для всех получаемых узлом сообщений.
</p> </p>
<p> <p>
Сообщения передаются в виде объекта JavaScript с именем <code>msg</code>. Сообщения передаются в виде объекта JavaScript с именем <code>msg</code>.
</p> </p>
<p> <p>
Обычно он имеет свойство <code>msg.payload</code>, содержащее тело сообщения. Обычно у объекта есть свойство <code>msg.payload</code>, содержащее тело сообщения.
</p> </p>
<p> <p>
Ожидается, что функция вернет объект сообщения (или несколько объектов сообщения), но может также ничего не возвращать, чтобы остановить поток. Ожидается, что функция вернет объект сообщения (или несколько объектов сообщения), которые будут отправлены следующим узлам в потоке, но может также ничего не возвращать, чтобы остановить поток.
</p> </p>
<p> <p>
Код настройки, выполняемый один раз при запуске сервера или при развертывании новой конфигурации потока, можно указать во вкладке <b>Настройка</b>. Кроме того, код очистки, выполняемый при остановке или повторном развертывании узла, можно указать во вкладке <b>Закрытие</b>. Код настройки, выполняемый один раз при запуске сервера или при развертывании новой конфигурации потока, можно ввести во вкладке <b>Настройка</b>. Также во вкладке <b>Закрытие</b> можно ввести код очистки, выполняемый при остановке или повторном развертывании узла.
</p> </p>
<p> <p>
Если код настройки возвращает объект Promise, обработка входящих сообщений узлом начнется после его завершения. Если код настройки возвращает Promise объект, тогда обработка входящих сообщений узлом начнется после его завершения.
</p> </p>
<h3>Подробности</h3> <h3>Подробности</h3>
@ -47,8 +47,8 @@
Она может вернуть/отправить: Она может вернуть/отправить:
</p> </p>
<ul> <ul>
<li>один объект сообщения - передается узлам, подключенным к первому выходу</li> <li>один объект сообщения - передается узлам, подключенным к первому порту выхода</li>
<li>массив объектов сообщений - передается на узлы, подключенные к соответствующим выходам</li> <li>массив объектов сообщений - передается на узлы, подключенные к соответствующим портам выхода</li>
</ul> </ul>
<p> <p>
Примечание: код настройки выполняется во время инициализации узлов. Таким образом, если на вкладке настройки кода вызывается <code>node.send</code>, последующие узлы могут не получить это сообщение. Примечание: код настройки выполняется во время инициализации узлов. Таким образом, если на вкладке настройки кода вызывается <code>node.send</code>, последующие узлы могут не получить это сообщение.
@ -70,13 +70,13 @@
<li><code>node.error("Ошибка")</code></li> <li><code>node.error("Ошибка")</code></li>
</ul> </ul>
<p> <p>
Узел Catch также может использоваться для обработки ошибок. Чтобы узел Catch мог ловить сообщение об ошибке, передайте <code>msg</code> в качестве второго аргумента в <code>node.error</code>: Также узел Catch может использоваться для обработки ошибок. Чтобы можно было ловить оповещения об ошибке, при вызове <code>node.error</code> передайте <code>msg</code> в качестве второго аргумента:
</p> </p>
<pre>node.error("Ошибка", msg);</pre> <pre>node.error("Ошибка", msg);</pre>
<h4>Доступ к информации об узле</h4> <h4>Доступ к информации об узле</h4>
<p> <p>
В функциональном блоке к идентификатору и имени узла можно обращаться, используя следующие свойства: В функции можно обращаться к идентификатору и имени узла, используя следующие свойства:
</p> </p>
<ul> <ul>
<li><code>node.id</code> - идентификатор узла</li> <li><code>node.id</code> - идентификатор узла</li>

View File

@ -16,18 +16,18 @@
<script type="text/html" data-help-name="switch"> <script type="text/html" data-help-name="switch">
<p> <p>
Направляет сообщения по разным ветвям потока на основе значений свойств сообщения или его позиции в последовательности. Направляет сообщения по разным ветвям потока, в завсимости от значений свойств сообщения или его позиции в последовательности.
</p> </p>
<h3>Подробности</h3> <h3>Подробности</h3>
<p> <p>
Когда приходит сообщение, узел выполняет проверку соответствия каждому из определенных правил и перенаправляет сообщение на их выходы. Когда приходит сообщение, узел выполняет проверку соответствия сообщения каждому из установленных правил и перенаправляет сообщение на соответствующие выходы.
</p> </p>
<p> <p>
При желании узел может быть настроен на прекращение проверки правил, как только он найдет первое подходящее. При желании узел может быть настроен на прекращение проверки правил после того как найдено первое подходящее.
</p> </p>
<p> <p>
Правила могут выполняться для отдельного свойства сообщения, свойства потокового или глобального контекста, переменной среды или результата выражения JSONata. Правила могут применяться к свойству сообщения, свойству потокового или глобального контекста, переменной среды или результату выражения JSONata.
</p> </p>
<h4>Правила</h4> <h4>Правила</h4>
@ -35,8 +35,8 @@
Существует четыре типа правил: Существует четыре типа правил:
</p> </p>
<ol> <ol>
<li>Правила <b>value rules</b> сравниваются с указанным свойством</li> <li>Правила категории <b>value rules</b> сравнивают значение указанного свойства сообщения</li>
<li>Правила <b>sequence rules</b> могут применяться для последовательностей сообщений, таких как сгенерированные узлом Split</li> <li>Правила категории <b>sequence rules</b> могут применяться для последовательностей сообщений, таких как сгенерированные узлом Split</li>
<li><b>Выражение JSONata</b> исполняется для сообщения и считается подходящим, если оно возвращает истинное значение</li> <li><b>Выражение JSONata</b> исполняется для сообщения и считается подходящим, если оно возвращает истинное значение</li>
<li>Правило <b>иначе</b> используется для сообщений, не подходящих ни под одно из предыдущих правил.</li> <li>Правило <b>иначе</b> используется для сообщений, не подходящих ни под одно из предыдущих правил.</li>
</ol> </ol>
@ -51,7 +51,7 @@
<h4>Обработка последовательностей сообщений</h4> <h4>Обработка последовательностей сообщений</h4>
<p> <p>
По умолчанию узел не изменяет свойство <code>msg.parts</code> у сообщений, которые являются частью последовательности. По умолчанию узел не изменяет свойство <code>msg.parts</code> у сообщений, являющихся частью последовательности.
</p> </p>
<p> <p>
Можно включить параметр <b>пересоздавать последовательности сообщений</b> для создания новых последовательностей сообщений для каждого соответствующего правила. В этом режиме узел будет помещать в буфер всю входящую последовательность перед отправкой новых последовательностей. Настройка <code>nodeMessageBufferMaxLength</code> может быть использована для ограничения количества сообщений в буфере. Можно включить параметр <b>пересоздавать последовательности сообщений</b> для создания новых последовательностей сообщений для каждого соответствующего правила. В этом режиме узел будет помещать в буфер всю входящую последовательность перед отправкой новых последовательностей. Настройка <code>nodeMessageBufferMaxLength</code> может быть использована для ограничения количества сообщений в буфере.

View File

@ -19,7 +19,7 @@
Устанавливает, изменяет, удаляет или перемещает свойства сообщения, контекста потока или глобального контекста. Устанавливает, изменяет, удаляет или перемещает свойства сообщения, контекста потока или глобального контекста.
</p> </p>
<p> <p>
В узле можно указать несколько правил, которые будут применяться в том порядке, в котором они определены. В узле можно указать несколько операций, которые будут применяться в том порядке, в котором они заданы.
</p> </p>
<h3>Подробности</h3> <h3>Подробности</h3>
@ -28,13 +28,13 @@
</p> </p>
<dl class="message-properties"> <dl class="message-properties">
<dt>Установить</dt> <dt>Установить</dt>
<dd>установить свойство. Значение может быть разных типов или может быть взято из существующего свойства сообщения или контекста.</dd> <dd>устанавливает свойство. Значение может быть различных типов или может быть взято из существующего свойства сообщения или контекста.</dd>
<dt>Изменить</dt> <dt>Изменить</dt>
<dd>найти &amp; заменить части свойства. Если используется регулярное выражение, настройка &quot;заменить на&quot; может включать группы захвата, например <code>$1</code>. При полном совпадении заменяет только тип.</dd> <dd>ищет и заменяет части текста в свойстве сообщения. Если используется регулярное выражение, настройка &quot;заменить на&quot; может включать группы захвата, например <code>$1</code>. При полном совпадении заменяет только тип.</dd>
<dt>Удалить</dt> <dt>Удалить</dt>
<dd>удалить свойство.</dd> <dd>удаляет свойство.</dd>
<dt>Переместить</dt> <dt>Переместить</dt>
<dd>переместить или переименовать свойство.</dd> <dd>перемещает или переименовывает свойство.</dd>
</dl> </dl>
<p> <p>
Тип свойства &quot;выражение&quot; использует язык запросов и выражений <a href="http://jsonata.org/" target="_new">JSONata</a>. Тип свойства &quot;выражение&quot; использует язык запросов и выражений <a href="http://jsonata.org/" target="_new">JSONata</a>.

View File

@ -16,7 +16,7 @@
<script type="text/html" data-help-name="range"> <script type="text/html" data-help-name="range">
<p> <p>
Соотносит значение одного числового диапазона к другому числовому диапазону. Соотносит значение одного числового диапазона с другим числовым диапазоном.
</p> </p>
<h3>Принимает</h3> <h3>Принимает</h3>
@ -28,7 +28,7 @@
<h3>Выводит</h3> <h3>Выводит</h3>
<dl class="message-properties"> <dl class="message-properties">
<dt>payload <span class="property-type">число</span></dt> <dt>payload <span class="property-type">число</span></dt>
<dd>Значение, соотнесенное к новому диапазону.</dd> <dd>Значение, соотнесенное с новым диапазоном.</dd>
</dl> </dl>
<h3>Подробности</h3> <h3>Подробности</h3>
@ -42,7 +42,7 @@
<i>Масштабировать и обернуть в целевой диапазон</i> означает, что результат будет обернут вокруг целевого диапазона: <i>Масштабировать и обернуть в целевой диапазон</i> означает, что результат будет обернут вокруг целевого диапазона:
</p> </p>
<p> <p>
Например, для входа 0 - 10 сопоставленного с 0 - 100. Например, если входные 0 - 10 сопоставляются с 0 - 100:
</p> </p>
<table style="outline-width:#888 solid thin"> <table style="outline-width:#888 solid thin">
<tr><th width="80px">режим</th><th width="80px">вход</th><th width="80px">выход</th></tr> <tr><th width="80px">режим</th><th width="80px">вход</th><th width="80px">выход</th></tr>

View File

@ -16,7 +16,7 @@
<script type="text/html" data-help-name="template"> <script type="text/html" data-help-name="template">
<p> <p>
Устанавливает свойство на основе предоставленного шаблона. Генерирует текст по установленному шаблону и присваивает его выбранному свойству сообщения.
</p> </p>
<h3>Принимает</h3> <h3>Принимает</h3>
@ -24,23 +24,23 @@
<dt>msg <span class="property-type">объект</span></dt> <dt>msg <span class="property-type">объект</span></dt>
<dd>Объект сообщения msg, содержащий информацию для заполнения шаблона.</dd> <dd>Объект сообщения msg, содержащий информацию для заполнения шаблона.</dd>
<dt class="optional">шаблон <span class="property-type">строка</span></dt> <dt class="optional">шаблон <span class="property-type">строка</span></dt>
<dd>Шаблон для заполнения данными из сообщения msg. Если шаблон не настроен на панели редактирования, тогда он может быть установлен через свойство msg.template.</dd> <dd>Шаблон текста для заполнения данными из сообщения msg. Если шаблон не введен на панели редактирования, тогда он может быть установлен через свойство msg.template.</dd>
</dl> </dl>
<h3>Выводит</h3> <h3>Выводит</h3>
<dl class="message-properties"> <dl class="message-properties">
<dt>msg <span class="property-type">объект</span></dt> <dt>msg <span class="property-type">объект</span></dt>
<dd>Сообщение msg, у которого выбранному свойству присвоено значение, сформированное заполнением шаблона свойствами из входящего сообщения.</dd> <dd>Сообщение msg, у которого выбранному свойству присвоено тексктовое значение, полученное после заполнения шаблона данными входящего сообщения.</dd>
</dl> </dl>
<h3>Подробности</h3> <h3>Подробности</h3>
<p> <p>
По умолчанию используется формат <i><a href="http://mustache.github.io/mustache.5.html" target="_blank">mustache</a></i>, но это может быть выключено при необходимости. По умолчанию используется формат <i><a href="http://mustache.github.io/mustache.5.html" target="_blank">mustache</a></i>. При необходимости это можно отключить.
</p> </p>
<p> <p>
Например, когда шаблон: Например, когда шаблон:
</p> </p>
<pre>Привет, {{payload.name}}. Сегодня {{date}}</pre> <pre>Привет, {{payload.name}}. Сегодня {{date}}.</pre>
<p> <p>
получает сообщение msg, содержащее: получает сообщение msg, содержащее:
</p> </p>
@ -51,13 +51,13 @@
} }
}</pre> }</pre>
<p> <p>
Результирующее свойство будет: Выбранному свойству будет присвоен текст:
</p> </p>
<pre>Привет, Иван. Сегодня понедельник</pre> <pre>Привет, Иван. Сегодня понедельник.</pre>
<p> <p>
Можно использовать свойство из контекста потока или глобального контекста. Просто используйте <code>{{flow.name}}</code> или <code>{{global.name}}</code>, или для постоянного хранилища <code>store</code> используйте <code>{{flow[store].name}}</code> или <code>{{global[store].name}}</code>. Можно использовать свойство из контекста потока или глобального контекста. Просто используйте <code>{{flow.name}}</code> или <code>{{global.name}}</code>, или для постоянного хранилища <code>store</code> используйте <code>{{flow[store].name}}</code> или <code>{{global[store].name}}</code>.
</p> </p>
<p> <p>
<b>Примечание:</b> по умолчанию <i>mustache</i> кодирует любые не алфавитно-цифровых или HTML-сущности в значениях, которые он подставляет, для безопасного использования в HTML. Чтобы предотвратить это, используйте тройные фигурные скобки <code>{{{triple}}}</code>. <b>Примечание:</b> по умолчанию <i>mustache</i> заменяет определенные символы их escape-кодами для безопасного использования в HTML. Чтобы это не происходило, вы можете использовать тройные фигурные скобки <code>{{{triple}}}</code>.
</p> </p>
</script> </script>

View File

@ -21,20 +21,20 @@
<h3>Принимает</h3> <h3>Принимает</h3>
<dl class="message-properties"> <dl class="message-properties">
<dt class="optional">delay <span class="property-type">число</span></dt> <dt class="optional">delay <span class="property-type">число</span></dt>
<dd>Устанавливает задержку в миллисекундах, которая будет применена к сообщению. Этот параметр применяется только в том случае, если узел настроен на то, чтобы разрешать сообщению переопределять установленный интервал задержки по умолчанию.</dd> <dd>Устанавливает задержку в миллисекундах, которая будет применена к сообщению. Этот параметр применяется только в том случае, если узел настроен так, чтобы разрешать сообщению переопределять установленный интервал задержки по умолчанию.</dd>
<dt class="optional">reset</dt> <dt class="optional">reset</dt>
<dd>Если в полученном сообщении этому свойству присвоено какое-либо значение, все ожидающие сообщения, удерживаемые узлом, очищаются без дальнейшей отправки.</dd> <dd>Если в полученном сообщении этому свойству присвоено какое-либо значение, все ожидающие сообщения, удерживаемые узлом, сбрасываются без дальнейшей отправки.</dd>
<dt class="optional">flush</dt> <dt class="optional">flush</dt>
<dd>Если в полученном сообщении этому свойству присвоено какое-либо значение, все ожидающие сообщения, удерживаемые узлом, немедленно отправляются далее.</dd> <dd>Если в полученном сообщении этому свойству присвоено какое-либо значение, все ожидающие сообщения, удерживаемые узлом, немедленно отправляются далее.</dd>
</dl> </dl>
<h3>Подробности</h3> <h3>Подробности</h3>
<p> <p>
Когда настроено задерживать сообщения, интервал задержки может быть фиксированным значением, случайным значением в пределах диапазона или динамически установленным для каждого сообщения. Каждое сообщение задерживается независимо от любых других сообщений, основываясь на времени его прибытия. Когда узел настроен на задержку сообщений, интервал задержки может быть фиксированным значением, случайным значением в пределах диапазона или динамически установленным для каждого сообщения. Каждое сообщение задерживается независимо от любых других сообщений, основываясь на времени его прибытия в узел.
</p> </p>
<p> <p>
Когда настроено ограничивать скорость сообщений, их доставка распределяется по настроенному периоду времени. Статус показывает количество сообщений, находящихся в данный момент в очереди. Если выбрано он может отбрасывать промежуточные сообщений по мере их поступления. Когда узел настроен на ограничение скорости сообщений, их доставка распределяется по установленному периоду времени. Статус показывает количество сообщений, находящихся в данный момент в очереди. При необходимости узел может быть настроен на отбрасывание промежуточных сообщений по мере их поступления.
</p> </p>
<p> <p>
Ограничение скорости может применяться ко всем сообщениям или группировать их в соответствии со значением <code>msg.topic</code>. При группировании промежуточные сообщения автоматически отбрасываются. В каждом интервале времени узел может либо выпустить самое последнее сообщение для всех тем, либо выпустить самое последнее сообщение для следующей темы. Ограничение скорости может применяться ко всем сообщениям или группам сообщений в соответствии с их значением темы (<code>msg.topic</code>). При группировании промежуточные сообщения автоматически отбрасываются. В каждом интервале времени узел может либо выпустить самое последнее сообщение для всех тем, либо выпустить самое последнее сообщение для следующей темы.
</p> </p>
</script> </script>

View File

@ -16,7 +16,7 @@
<script type="text/html" data-help-name="trigger"> <script type="text/html" data-help-name="trigger">
<p> <p>
При срабатывании может отправить сообщение, а затем дополнительно второе сообщение, если оно не продлено или не сброшено. При срабатывании может отправить сообщение, а затем дополнительно второе сообщение, если не было сделано продление или сброс.
</p> </p>
<h3>Принимает</h3> <h3>Принимает</h3>
@ -24,15 +24,15 @@
<dt class="optional">delay <span class="property-type">число</span></dt> <dt class="optional">delay <span class="property-type">число</span></dt>
<dd>Устанавливает задержку в миллисекундах, которая будет применяться к сообщению. Этот параметр применяется только в том случае, если узел настроен так, чтобы сообщение могло отменять настроенный интервал задержки по умолчанию.</dd> <dd>Устанавливает задержку в миллисекундах, которая будет применяться к сообщению. Этот параметр применяется только в том случае, если узел настроен так, чтобы сообщение могло отменять настроенный интервал задержки по умолчанию.</dd>
<dt class="optional">reset</dt> <dt class="optional">reset</dt>
<dd>Если сообщение получено с этим свойством, любой тайм-аут или повтор, находящийся в обработке в текущий момент, будет сброшен, и сообщение не сработает.</dd> <dd>При получении сообщения с этим свойством, любой тайм-аут или повтор, находящиеся в обработке в текущий момент, будут сброшены, а сообщение не сработает.</dd>
</dl> </dl>
<h3>Подробности</h3> <h3>Подробности</h3>
<p> <p>
Этот узел можно использовать для создания тайм-аута в потоке. По умолчанию, когда узел получает сообщение, он отправляет сообщение с <code>payload</code> равным <code>1</code>. Затем он ждет 250 мс, прежде чем отправить второе сообщение с <code>payload</code> равным <code>0</code>. Это можно использовать, например, для мигания светодиода, подключенного к выводу Raspberry Pi GPIO. Этот узел можно использовать для создания тайм-аута внутри потока. По умолчанию, когда узел получает сообщение, он отправляет сообщение с <code>payload</code> равным <code>1</code>. Затем он ждет 250 мс, прежде чем отправить второе сообщение с <code>payload</code> равным <code>0</code>. Это можно использовать, например, для мигания светодиодом, подключеным к выходу GPIO у Raspberry Pi.
</p> </p>
<p> <p>
Данные каждого отправленного сообщения могут быть настроены на различные значения, включая возможность ничего не отправлять. Например, если установить начальное сообщение на <i>ничего</i> и выбрать опцию продления таймера с каждым новым сообщением, узел будет действовать как сторожевой таймер, отправляя сообщение только в том случае, если ничего не получено в течение установленного интервала. Данные каждого отправленного сообщения могут быть настроены на различные значения, включая возможность ничего не отправлять. Например, если установить первоначальное сообщение на <i>ничего</i> и выбрать опцию продления таймера с каждым новым сообщением, узел будет действовать как сторожевой таймер, отправляя сообщение только в том случае, если ничего не получено в течение установленного интервала.
</p> </p>
<p> <p>
Если установлен тип <i>строка</i>, узел поддерживает синтаксис шаблона mustache. Если установлен тип <i>строка</i>, узел поддерживает синтаксис шаблона mustache.
@ -44,12 +44,12 @@
Если узел получает сообщение со свойством <code>reset</code> или <code>payload</code>, который совпадает с настроенным в узле, любой тайм-аут или повтор, находящийся в обработке в текущий момент, будет сброшен, и сообщение не сработает. Если узел получает сообщение со свойством <code>reset</code> или <code>payload</code>, который совпадает с настроенным в узле, любой тайм-аут или повтор, находящийся в обработке в текущий момент, будет сброшен, и сообщение не сработает.
</p> </p>
<p> <p>
Узел может быть настроен на повторную отправку сообщения с регулярным интервалом, пока оно не будет сброшено полученным сообщением. Узел может быть настроен на повторную отправку сообщения с регулярным интервалом, пока не будет произведен сброс отправкой на него сообщения.
</p> </p>
<p> <p>
При желании узел может быть настроен на обработку сообщений, как если бы они были отдельными потоками, используя свойство msg для идентификации каждого потока. По умолчанию <code>msg.topic</code>. При желании узел может быть настроен на обработку сообщений, как если бы они были отдельными потоками, используя свойство msg для идентификации каждого потока. По умолчанию <code>msg.topic</code>.
</p> </p>
<p> <p>
Статус показывает, что узел в данный момент активен. Если используется несколько потоков, статус показывает количество удерживаемых потоков. Статус показывает - активен ли узел в данный момент. Если работает в многопоточном режиме, статус показывает количество удерживаемых потоков.
</p> </p>
</script> </script>

View File

@ -19,16 +19,16 @@
Запускает системную команду и возвращает ее вывод. Запускает системную команду и возвращает ее вывод.
</p> </p>
<p> <p>
Узел может быть настроен либо на ожидание завершения команды, либо на отправку своих выходных данных, пока команда их генерирует. Узел может быть настроен либо на ожидание завершения выполнения команды, либо на отправку выходных данных по мере их генерации в ходе выполнения.
</p> </p>
<p> <p>
Выполняемая команда может быть настроена в узле или предоставлена полученным сообщением. Выполняемая команда может быть установлена в настройках узла или полученным сообщением.
</p> </p>
<h3>Принимает</h3> <h3>Принимает</h3>
<dl class="message-properties"> <dl class="message-properties">
<dt class="optional">payload <span class="property-type">строка</span></dt> <dt class="optional">payload <span class="property-type">строка</span></dt>
<dd>будет добавлено к выполненной команде, если настроено так делать.</dd> <dd>будет добавлено к выполняемой команде, если узел настроен так делать.</dd>
<dt class="optional">kill <span class="property-type">строка</span></dt> <dt class="optional">kill <span class="property-type">строка</span></dt>
<dd>тип сигнала уничтожения для отправки существующему процессу узла exec.</dd> <dd>тип сигнала уничтожения для отправки существующему процессу узла exec.</dd>
<dt class="optional">pid <span class="property-type">число|строка</span></dt> <dt class="optional">pid <span class="property-type">число|строка</span></dt>
@ -44,7 +44,7 @@
</dl> </dl>
<dl class="message-properties"> <dl class="message-properties">
<dt>rc <span class="property-type">объект</span></dt> <dt>rc <span class="property-type">объект</span></dt>
<dd>только в exec режиме, копия объекта кода возврата (также доступна на порту 3)</dd> <dd>только в exec режиме, копия объекта кода возврата (также доступна по 3-му порту)</dd>
</dl> </dl>
</li> </li>
<li>Стандартный вывод ошибок <li>Стандартный вывод ошибок
@ -54,7 +54,7 @@
</dl> </dl>
<dl class="message-properties"> <dl class="message-properties">
<dt>rc <span class="property-type">объект</span></dt> <dt>rc <span class="property-type">объект</span></dt>
<dd>только в exec режиме, копия объекта кода возврата (также доступна на порту 3)</dd> <dd>только в exec режиме, копия объекта кода возврата (также доступна по 3-му порту)</dd>
</dl> </dl>
</li> </li>
<li>Код возврата <li>Код возврата
@ -73,7 +73,7 @@
При желании вместо этого можно использовать <code>spawn</code>, который возвращает выходные данные из stdout и stderr по ходу выполнения команды, обычно по одной строке за раз. После завершения он возвращает объект на 3-й порт. Например, успешная команда должна вернуть <code>{code: 0}</code>. При желании вместо этого можно использовать <code>spawn</code>, который возвращает выходные данные из stdout и stderr по ходу выполнения команды, обычно по одной строке за раз. После завершения он возвращает объект на 3-й порт. Например, успешная команда должна вернуть <code>{code: 0}</code>.
</p> </p>
<p> <p>
Ошибки могут возвращать дополнительную информацию на 3-м порту в <code>msg.payload</code>, такую как строка <code>message</code>, строка <code>signal</code>. Ошибки могут возвращать на 3-й порт дополнительную информацию в <code>msg.payload</code>, такую как строка <code>message</code>, строка <code>signal</code>.
</p> </p>
<p> <p>
Выполняемая команда настраивается в узле, с возможностью добавления к ней <code>msg.payload</code> и дополнительного набора параметров. Выполняемая команда настраивается в узле, с возможностью добавления к ней <code>msg.payload</code> и дополнительного набора параметров.
@ -82,25 +82,25 @@
Команды или параметры с пробелами должны быть заключены в кавычки - <code>"Это один параметр"</code> Команды или параметры с пробелами должны быть заключены в кавычки - <code>"Это один параметр"</code>
</p> </p>
<p> <p>
Возвращаемый <code>payload</code> обычно представляет собой <i>строку</i>, пока не обнаружены символы, отличные от UTF8, в этом случае это <i>буфер</i>. Возвращаемый <code>payload</code> обычно представляет собой <i>строку</i>, пока не обнаружены символы, отличные от UTF8, в этом случае возвращаемое значение будет иметь тип <i>буфер</i>.
</p> </p>
<p> <p>
Значок состояния узла и PID будут видны, пока узел активен. Изменения в статусе могут быть прочитаны узлом <code>Status</code>. Значок статуса узла и PID будут видны, когда узел активен. Изменения в статусе можно отслеживать узлом <code>Status</code>.
</p> </p>
<h4> <h4>
Уничтожения процессов Уничтожения процессов
</h4> </h4>
<p> <p>
Отправка <code>msg.kill</code> уничтожит один активный процесс. <code>msg.kill</code> должен быть строкой, содержащей тип передаваемого сигнала, например, <code>SIGINT</code>, <code>SIGQUIT</code> или <code>SIGHUP</code>. По умолчанию <code>SIGTERM</code>, если задана пустая строка. Отправка <code>msg.kill</code> уничтожит один активный процесс. <code>msg.kill</code> должен быть строкой, содержащей тип передаваемого сигнала, например, <code>SIGINT</code>, <code>SIGQUIT</code> или <code>SIGHUP</code>. По умолчанию будет передан <code>SIGTERM</code>, если задана пустая строка.
</p> </p>
<p> <p>
Если узлом запущено более одного процесса, тогда в <code>msg.pid</code> также должно быть установлено значение PID для уничтожения. Если узлом запущено более одного процесса, тогда в <code>msg.pid</code> также должно быть установлено значение PID процесса для уничтожения.
</p> </p>
<p> <p>
Если в поле <code>Тайм-аут</code> указано значение, то, если процесс не завершится по истечении указанного количества секунд, он будет автоматически уничтожен Если в поле <code>Тайм-аут</code> введено значение, тогда, если процесс не завершится по истечении указанного количества секунд, он будет автоматически уничтожен.
</p> </p>
<p> <p>
Совет: если Вы запускаете Python приложение, Вам может потребоваться использовать параметр <code>-u</code>, чтобы остановить буферизацию вывода. Совет: если вы запускаете Python приложение, вам может потребоваться использование параметра <code>-u</code>, чтобы остановить буферизацию вывода.
</p> </p>
</script> </script>

View File

@ -46,7 +46,7 @@
"bool": "логический тип", "bool": "логический тип",
"json": "объект", "json": "объект",
"bin": "буфер", "bin": "буфер",
"date": "отметка времени", "date": "метка времени",
"env": "переменная среды", "env": "переменная среды",
"object": "объект", "object": "объект",
"string": "строка", "string": "строка",
@ -55,7 +55,7 @@
"Array": "массив", "Array": "массив",
"invalid": "Неверный объект JSON" "invalid": "Неверный объект JSON"
}, },
"timestamp": "отметка времени", "timestamp": "метка времени",
"none": "нет", "none": "нет",
"interval": "с интервалом", "interval": "с интервалом",
"interval-time": "с интервалом в промежутке", "interval-time": "с интервалом в промежутке",

View File

@ -15,5 +15,5 @@
--> -->
<script type="text/html" data-help-name="tls-config"> <script type="text/html" data-help-name="tls-config">
<p>Параметры конфигурации для соединений TLS.</p> <p>Параметры конфигурации для TLS соединений.</p>
</script> </script>

View File

@ -21,6 +21,6 @@
<h3>Подробности</h3> <h3>Подробности</h3>
<p> <p>
При доступе к хосту, находящемуся в списке игнорируемых хостов, прокси не будет использоваться. При обращении к хосту, находящемуся в списке игнорируемых хостов, прокси не будет использоваться.
</p> </p>
</script> </script>

View File

@ -13,7 +13,7 @@
<script type="text/html" data-help-name="mqtt in"> <script type="text/html" data-help-name="mqtt in">
<p> <p>
Подключается к брокеру MQTT и подписывается на сообщения из указанной темы. Подключается к MQTT брокеру и подписывается на сообщения указанной темы.
</p> </p>
<h3>Выводит</h3> <h3>Выводит</h3>
@ -36,13 +36,13 @@
Для этого узла требуется соединение с брокером MQTT. Это настраивается нажатием на значок карандаша. Для этого узла требуется соединение с брокером MQTT. Это настраивается нажатием на значок карандаша.
</p> </p>
<p> <p>
Несколько узлов MQTT (in или out) могут совместно использовать одно и то же соединение с брокером, если это необходимо. Несколько MQTT узлов (in или out) могут совместно использовать одно и то же соединение с брокером, если это необходимо.
</p> </p>
</script> </script>
<script type="text/html" data-help-name="mqtt out"> <script type="text/html" data-help-name="mqtt out">
<p> <p>
Подключается к брокеру MQTT и публикует сообщения. Подключается к MQTT брокеру и публикует сообщения.
</p> </p>
<h3>Принимает</h3> <h3>Принимает</h3>
@ -80,13 +80,13 @@
<script type="text/html" data-help-name="mqtt-broker"> <script type="text/html" data-help-name="mqtt-broker">
<p> <p>
Конфигурация для подключения к брокеру MQTT. Конфигурация для подключения к MQTT брокеру.
</p> </p>
<p> <p>
Эта конфигурация создаст одно соединение с посредником, которое затем может быть повторно использовано узлами <code>MQTT In</code> и <code>MQTT Out</code>. Эта конфигурация создаст одно соединение с посредником, которое затем может быть повторно использовано узлами <code>MQTT In</code> и <code>MQTT Out</code>.
</p> </p>
<p> <p>
Узел сгенерирует случайный идентификатор клиента, если он не задан, а узел настроен на использование соединения с чистым сеансом. Если идентификатор клиента установлен, он должен быть уникальным для брокера, к которому Вы подключаетесь. Узел сгенерирует случайный идентификатор клиента, если он не задан, а узел настроен на использование соединения с чистым сеансом. Если идентификатор клиента установлен, он должен быть уникальным для брокера, к которому вы подключаетесь.
</p> </p>
<h4>Birth сообщение</h4> <h4>Birth сообщение</h4>
@ -96,7 +96,7 @@
<h4>Close сообщение</h4> <h4>Close сообщение</h4>
<p> <p>
Это сообщение будет опубликовано в настроенной теме перед тем, как соединение будет закрыто нормально, либо путем повторного развертывания узла, либо остановкой. Это сообщение будет опубликовано в настроенной теме перед тем, как соединение будет закрыто обычным образом, либо путем повторного развертывания узла, либо остановкой.
</p> </p>
<h4>Will сообщение</h4> <h4>Will сообщение</h4>
@ -106,7 +106,7 @@
<h4>WebSockets</h4> <h4>WebSockets</h4>
<p> <p>
Узел может быть настроен на использование соединения WebSocket. Для этого в поле Сервер должен быть указан полный URI для соединения. Например: Узел может быть настроен на использование WebSocket соединения. Для этого в поле Сервер должен быть указан полный URI для соединения. Например:
</p> </p>
<pre>ws://example.com:4000/mqtt</pre> <pre>ws://example.com:4000/mqtt</pre>

View File

@ -16,7 +16,7 @@
<script type="text/html" data-help-name="http in"> <script type="text/html" data-help-name="http in">
<p> <p>
Создает конечную точку HTTP для создания веб-сервисов. Создает конечную точку HTTP для веб-службы.
</p> </p>
<h3>Выводит</h3> <h3>Выводит</h3>
@ -35,12 +35,12 @@
</ul> </ul>
</dd> </dd>
<dt>res<span class="property-type">объект</span></dt> <dt>res<span class="property-type">объект</span></dt>
<dd>Объект ответа HTTP. Это свойство не должно использоваться напрямую; узел ответа <code>HTTP Response</code> описывает, как ответить на запрос. Это свойство должно оставаться в сообщении, передаваемому узлу ответа.</dd> <dd>Объект ответа HTTP. Это свойство не должно использоваться напрямую. Для ответа на входящий HTTP запрос используется узел ответа <code>HTTP Response</code>. Это свойство должно оставаться в сообщении вплоть до передачи узлу ответа.</dd>
</dl> </dl>
<h3>Подробности</h3> <h3>Подробности</h3>
<p> <p>
По настроенному пути узел будет слушать запросы определенного типа. Путь может быть указан полностью, например <code>/user</code>, или включать именованные параметры, которые принимают любое значение, например <code>/user/:name</code>. Когда используются именованные параметры, их фактическое значение в запросе будет доступно в <code>msg.req.params</code>. По настроенному пути узел будет принимать запросы определенного типа. Путь может быть указан конкретно, например <code>/user</code>, или включать именованные параметры, которые принимают любое значение, например <code>/user/:name</code>. Когда используются именованные параметры, их фактическое значение в запросе будет доступно в <code>msg.req.params</code>.
</p> </p>
<p> <p>
Для запросов, которые содержат тело, такие как POST или PUT, содержимое запроса доступно в <code>msg.payload</code>. Для запросов, которые содержат тело, такие как POST или PUT, содержимое запроса доступно в <code>msg.payload</code>.
@ -67,7 +67,7 @@
<dt class="optional">headers <span class="property-type">объект</span></dt> <dt class="optional">headers <span class="property-type">объект</span></dt>
<dd>Если установлено, предоставляет заголовки HTTP для включения в ответ.</dd> <dd>Если установлено, предоставляет заголовки HTTP для включения в ответ.</dd>
<dt class="optional">cookies <span class="property-type">объект</span></dt> <dt class="optional">cookies <span class="property-type">объект</span></dt>
<dd>Если установлено, может использоваться для установки или удаления куков.</dd> <dd>Если установлено, может использоваться для записи или удаления куков.</dd>
</dl> </dl>
<h3>Подробности</h3> <h3>Подробности</h3>
@ -80,7 +80,7 @@
Свойство <code>cookies</code> должно быть объектом пар имя/значение. Значением может быть либо строка для установки значения куки с параметрами по умолчанию, либо это может быть объект параметров. Свойство <code>cookies</code> должно быть объектом пар имя/значение. Значением может быть либо строка для установки значения куки с параметрами по умолчанию, либо это может быть объект параметров.
</p> </p>
<p> <p>
В следующем примере устанавливаются два куки - один с именем <code>name</code> со значением <code>nick</code>, другой с именем <code>session</code> со значением <code>1234</code> и сроком действия в 15 минут. В следующем примере устанавливаются два куки - один с именем <code>name</code> и значением <code>nick</code>, другой с именем <code>session</code> и значением <code>1234</code> и сроком действия в 15 минут.
</p> </p>
<pre> <pre>
msg.cookies = { msg.cookies = {

View File

@ -32,7 +32,7 @@
<dt class="optional">payload</dt> <dt class="optional">payload</dt>
<dd>Отправляется как тело запроса.</dd> <dd>Отправляется как тело запроса.</dd>
<dt class="optional">rejectUnauthorized</dt> <dt class="optional">rejectUnauthorized</dt>
<dd>Если установлено значение <code>false</code>, разрешает отправлять запросы на сайты https, которые используют самозаверяющие сертификаты.</dd> <dd>Если установлено значение <code>false</code>, разрешает отправлять запросы на сайты https, которые используют самозаверенные сертификаты.</dd>
<dt class="optional">followRedirects</dt> <dt class="optional">followRedirects</dt>
<dd>Если установлено значение <code>false</code>, запрещает переадресацию (HTTP 301). По умолчанию <code>true</code>.</dd> <dd>Если установлено значение <code>false</code>, запрещает переадресацию (HTTP 301). По умолчанию <code>true</code>.</dd>
<dt class="optional">requestTimeout</dt> <dt class="optional">requestTimeout</dt>
@ -68,20 +68,20 @@
<h4>Использование нескольких узлов HTTP-запросов</h4> <h4>Использование нескольких узлов HTTP-запросов</h4>
<p> <p>
Чтобы использовать более одного из этих узлов в одном потоке, нужно позаботиться о свойстве <code>msg.headers</code>. Первый узел установит это свойство с заголовками ответа. Затем следующий узел будет использовать эти заголовки для своего запроса - обычно это неправильный подход. Если свойство <code>msg.headers</code> остается неизменным между узлами, оно будет проигнорировано вторым узлом. Чтобы установить пользовательские заголовки, сначала необходимо удалить <code>msg.headers</code> или сбросить до пустого объекта: <code>{}</code>. Чтобы использовать несколько таких узлов в одном потоке, нужно позаботиться о свойстве <code>msg.headers</code>. Первый узел установит это свойство с заголовками ответа. Затем следующий узел будет использовать эти заголовки для своего запроса - обычно это неправильный подход. Если свойство <code>msg.headers</code> остается неизменным между узлами, оно будет проигнорировано вторым узлом. Чтобы установить свои заголовки, сначала необходимо удалить <code>msg.headers</code> или сбросить это свойство до пустого объекта: <code>{}</code>.
</p> </p>
<h4>Обработка куки</h4> <h4>Обработка куки</h4>
<p> <p>
Свойство <code>cookies</code>, передаваемое узлу, должно быть объектом пар имя/значение. Значением может быть либо строка для установки значения куки, либо это может быть объект с единственным свойством <code>value</code>. Свойство <code>cookies</code>, передаваемое узлу, должно быть объектом из пар имя/значение. Значением может быть либо строка для установки значения куки, либо это может быть объект с единственным свойством <code>value</code>.
</p> </p>
<p> <p>
Все куки, возвращаемые запросом, передаются обратно в свойство <code>responseCookies</code>. Все куки, возвращаемые запросом, передаются обратно в свойстве <code>responseCookies</code>.
</p> </p>
<h4>Обработка типов контента</h4> <h4>Обработка типов контента</h4>
<p> <p>
Если <code>msg.payload</code> является объектом, узел автоматически установит тип содержимого запроса в <code>application/json</code> и закодирует тело как таковое. Если <code>msg.payload</code> является объектом, узел автоматически установит тип содержимого запроса в <code>application/json</code> и закодирует тело соответствующим образом.
</p> </p>
<p> <p>
Чтобы закодировать запрос как данные формы, для <code>msg.headers["content-type"]</code> должно быть установлено <code>application/x-www-form-urlencoded</code>. Чтобы закодировать запрос как данные формы, для <code>msg.headers["content-type"]</code> должно быть установлено <code>application/x-www-form-urlencoded</code>.

View File

@ -16,7 +16,7 @@
<script type="text/html" data-help-name="websocket in"> <script type="text/html" data-help-name="websocket in">
<p> <p>
Входной узел WebSocket. Входящий узел WebSocket.
</p> </p>
<p> <p>
По умолчанию данные, полученные из WebSocket, будут в <code>msg.payload</code>. Сокет можно настроить так, чтобы он ожидал правильно сформированную строку JSON. В этом случае он будет анализировать JSON и отправлять полученный объект как полное сообщение. По умолчанию данные, полученные из WebSocket, будут в <code>msg.payload</code>. Сокет можно настроить так, чтобы он ожидал правильно сформированную строку JSON. В этом случае он будет анализировать JSON и отправлять полученный объект как полное сообщение.
@ -25,17 +25,17 @@
<script type="text/html" data-help-name="websocket out"> <script type="text/html" data-help-name="websocket out">
<p> <p>
Выходной узел WebSocket. Исходящий узел WebSocket.
</p> </p>
<p> <p>
По умолчанию <code>msg.payload</code> будет отправлено через WebSocket. Сокет может быть сконфигурирован для кодирования всего объекта <code>msg</code> в виде строки JSON и отправки его через WebSocket. По умолчанию <code>msg.payload</code> будет отправлено через WebSocket. Сокет может быть сконфигурирован для кодирования всего объекта <code>msg</code> в виде строки JSON и отправки его через WebSocket.
</p> </p>
<p> <p>
Если сообщение, поступающее на этот узел, началось с узла WebSocket In, сообщение будет отправлено обратно клиенту, который запустил поток. В противном случае сообщение будет передано всем подключенным клиентам. Если сообщение, поступающее на этот узел, было начато в потоке узлом WebSocket In, сообщение будет отправлено обратно клиенту, который запустил поток. В противном случае сообщение будет передано всем подключенным клиентам.
</p> </p>
<p> <p>
Если Вы хотите передать сообщение, которое началось на узле WebSocket In, всем подключенным клиентам, тогда Вы должны удалить свойство <code>msg._session</code> в потоке. Если Вы хотите передать сообщение, которое началось с узла WebSocket In, всем подключенным клиентам, тогда вам нужно удалить свойство <code>msg._session</code> перед тем как передавать его этому узлу.
</p> </p>
</script> </script>

View File

@ -16,16 +16,16 @@
<script type="text/html" data-help-name="tcp in"> <script type="text/html" data-help-name="tcp in">
<p> <p>
Предоставляет выбор TCP-входов. Можно либо подключаться к удаленному TCP-порту, либо принимать входящие подключения. Предоставляет выбор из нескольких входящих TCP-узлов. Можно либо подключаться к удаленному TCP-порту, либо принимать входящие подключения.
</p> </p>
<p> <p>
<b>Примечание.</b> В некоторых системах Вам могут потребоваться права root или администратора для доступа к портам ниже 1024. <b>Примечание.</b> В некоторых системах вам могут потребоваться права root или администратора для доступа к портам ниже 1024.
</p> </p>
</script> </script>
<script type="text/html" data-help-name="tcp out"> <script type="text/html" data-help-name="tcp out">
<p> <p>
Предоставляет выбор TCP-выходов. Может подключаться к удаленному TCP-порту, принимать входящие подключения или отвечать на сообщения, полученные от узла TCP In. Предоставляет выбор из нескольких исходящих TCP-узлов. Может подключаться к удаленному TCP-порту, принимать входящие подключения или отвечать на сообщения, полученные от узла TCP In.
</p> </p>
<p> <p>
Отправляются только данные <code>msg.payload</code>. Отправляются только данные <code>msg.payload</code>.
@ -37,21 +37,21 @@
Если <code>msg._session</code> отсутствует, данные отправляется <b>всем</b> подключенным клиентам. Если <code>msg._session</code> отсутствует, данные отправляется <b>всем</b> подключенным клиентам.
</p> </p>
<p> <p>
<b>Примечание.</b> В некоторых системах Вам могут потребоваться права root или администратора для доступа к портам ниже 1024. <b>Примечание.</b> В некоторых системах вам могут потребоваться права root или администратора для доступа к портам ниже 1024.
</p> </p>
</script> </script>
<script type="text/html" data-help-name="tcp request"> <script type="text/html" data-help-name="tcp request">
<p> <p>
Простой узел TCP-запроса - отправляет <code>msg.payload</code> на tcp-порт сервера и ожидает ответа. Узел TCP-запроса - отправляет <code>msg.payload</code> на tcp-порт сервера и ожидает ответа.
</p> </p>
<p> <p>
Подключается, отправляет &quot;запрос&quot; и читает &quot;ответ&quot;. Он может либо подсчитать количество возвращенных символов в фиксированный буфер, сопоставить указанный символ перед возвратом, дождаться фиксированного времени ожидания от первого ответа и затем вернуться, сидеть и дожидаться данных, или отправить, а затем немедленно закрыть соединение, не дожидаясь ответа. Подключается, отправляет &quot;запрос&quot; и читает &quot;ответ&quot;. Он может либо подсчитать количество возвращенных символов в фиксированный буфер, сопоставить указанный символ перед возвратом, дождаться фиксированного времени ожидания от первого ответа и затем вернуться, сидеть и дожидаться данных, или отправить, а затем немедленно закрыть соединение, не дожидаясь ответа.
</p> </p>
<p> <p>
Ответ будет выведен в <code>msg.payload</code> в виде буфера, поэтому Вы можете захотеть применить к нему .toString(). Ответ будет возвращен в <code>msg.payload</code> в виде буфера, поэтому вам может понадобиться применить к нему .toString(), если нужно преобразование в строку.
</p> </p>
<p> <p>
Если Вы оставите tcp-хост или порт пустыми, они должны быть установлены с помощью свойств <code>msg.host</code> и <code>msg.port</code> в каждом сообщении, отправляемом узлу. Если вы оставите tcp-хост или порт пустыми, они должны быть установлены с помощью свойств <code>msg.host</code> и <code>msg.port</code> в каждом сообщении, отправляемом узлу.
</p> </p>
</script> </script>

View File

@ -16,13 +16,13 @@
<script type="text/html" data-help-name="udp in"> <script type="text/html" data-help-name="udp in">
<p> <p>
Входной узел UDP, который создает <code>msg.payload</code>, содержащий буфер, строку или base64-строку. Поддерживает многоадресную рассылку. Входящий UDP-узел, который создает <code>msg.payload</code>, содержащий буфер, строку или base64-строку. Поддерживает многоадресную рассылку.
</p> </p>
<p> <p>
Он также предоставляет <code>msg.ip</code> и <code>msg.port</code> для IP-адреса и порта, с которого было получено сообщение. Он также предоставляет <code>msg.ip</code> и <code>msg.port</code> для IP-адреса и порта, с которого было получено сообщение.
</p> </p>
<p> <p>
<b>Примечание</b>. В некоторых системах Вам могут потребоваться права root или администратора для доступа к портам ниже 1024 и/или широковещательной рассылки. <b>Примечание</b>. В некоторых системах вам могут потребоваться права root или администратора для доступа к портам ниже 1024 и/или широковещательной рассылки.
</p> </p>
</script> </script>
@ -37,6 +37,6 @@
Если Вы выберете широковещательную рассылку, то либо задайте в качестве адреса локальный широковещательный IP-адрес, либо попробуйте 255.255.255.255, который является глобальным широковещательным адресом. Если Вы выберете широковещательную рассылку, то либо задайте в качестве адреса локальный широковещательный IP-адрес, либо попробуйте 255.255.255.255, который является глобальным широковещательным адресом.
</p> </p>
<p> <p>
<b>Примечание</b>. В некоторых системах Вам могут потребоваться права root или администратора для доступа к портам ниже 1024 и/или широковещательной рассылки. <b>Примечание</b>. В некоторых системах вам могут потребоваться права root или администратора для доступа к портам ниже 1024 и/или широковещательной рассылки.
</p> </p>
</script> </script>

View File

@ -30,10 +30,10 @@
<dt>payload<span class="property-type">объект | массив | строка</span></dt> <dt>payload<span class="property-type">объект | массив | строка</span></dt>
<dd> <dd>
<ul> <ul>
<li>Если вход является значением строкового типа, узел пытается проанализировать ее как CSV и создает объект JavaScript из пар ключ/значение для каждой строки. Затем узел либо отправит сообщение для каждой строки или одно сообщение, содержащее массив объектов.</li> <li>Если на входе значение строкового типа, узел попытается проанализировать его как CSV и создает объект JavaScript из пар ключ/значение для каждой строки. Затем узел либо отправит сообщение для каждой строки или одно сообщение, содержащее массив объектов.</li>
<li>Если вход является JavaScript объектом, узел пытается построить CSV-строку.</li> <li>Если на входе JavaScript объект, узел попробует построить CSV-строку.</li>
<li>Если вход является массивом простых значений, узел построит однострочную CSV-строку.</li> <li>Если на входе массив простых значений, узел построит однострочную CSV-строку.</li>
<li>Если вход является массивом массивов или массивом объектов, создается многострочная CSV-строка.</li> <li>Если на входе массив массивов или массив объектов, создается многострочная CSV-строка.</li>
</ul> </ul>
</dd> </dd>
</dl> </dl>
@ -46,7 +46,7 @@
При преобразовании в CSV шаблон столбцов используется для определения того, какие свойства извлекать из объекта и в каком порядке. При преобразовании в CSV шаблон столбцов используется для определения того, какие свойства извлекать из объекта и в каком порядке.
</p> </p>
<p> <p>
Если шаблон пуст, то узел может использовать простой список свойств, разделенных запятыми, предоставленных в <code>msg.columns</code>, чтобы определить, что извлечь. Если этого нет, то все свойства объекта выводятся в том порядке, в котором они были найдены в первой строке. Если шаблон пуст, то узел может использовать простой список свойств, разделенных запятыми, предоставленных в <code>msg.columns</code>, чтобы определить, что извлечь. Если его нет, то все свойства объекта выводятся в том порядке, в котором они были найдены в первой строке.
</p> </p>
<p> <p>
Если входные данные являются массивом, то шаблон столбцов используется только для необязательного генерирования строки с заголовками столбцов. Если входные данные являются массивом, то шаблон столбцов используется только для необязательного генерирования строки с заголовками столбцов.

View File

@ -37,7 +37,7 @@
</ul> </ul>
</dd> </dd>
<dt>schemaError<span class="property-type">массив</span></dt> <dt>schemaError<span class="property-type">массив</span></dt>
<dd>Если проверка JSON-схемы завершится неудачно, узел catch будет иметь свойство <code>schemaError</code>, содержащее массив ошибок.</dd> <dd>Если проверка JSON-схемы завершится неудачно, узлом catch можно получить свойство <code>schemaError</code>, содержащее массив ошибок.</dd>
</dl> </dl>
<h3>Подробности</h3> <h3>Подробности</h3>
@ -45,10 +45,10 @@
По умолчанию узел работает с <code>msg.payload</code>, но его можно настроить для преобразования любого свойства сообщения. По умолчанию узел работает с <code>msg.payload</code>, но его можно настроить для преобразования любого свойства сообщения.
</p> </p>
<p> <p>
Узел также может быть сконфигурирован для обеспечения конкретной кодировки вместо переключения между ними. Это можно использовать, например, с узлом <code>HTTP In</code>, чтобы гарантировать, что данные payload являются объектом, даже если входящий запрос неправильно установил свой тип содержимого для узла HTTP In, чтобы выполнить преобразование. Узел также может быть сконфигурирован для обеспечения конкретной кодировки вместо переключения между ними. Это можно использовать, например, при работе с узлом <code>HTTP In</code>, чтобы гарантировать, что данные payload всегда будут являться объектом, даже если входящий запрос неправильно установил свой тип содержимого для узла HTTP In, чтобы выполнить преобразование.
</p> </p>
<p> <p>
Если узел настроен на то, чтобы свойство кодировалось как строка, и он получает строку, дальнейшие проверки этого свойства выполняться не будут. Он не будет проверять, является ли строка допустимым JSON, и не будет переформатировать ее, если выбрана опция форматирования. Если узел настроен так, чтобы свойство кодировалось как строка, и он получает строку, дальнейшие проверки этого свойства выполняться не будут. Он не будет проверять, является ли строка допустимым JSON, и не будет переформатировать ее, если выбрана опция форматирования.
</p> </p>
<p> <p>
Подробнее о JSON-схеме Вы можете узнать в спецификации <a href="http://json-schema.org/latest/json-schema-validation.html">здесь</a>. Подробнее о JSON-схеме Вы можете узнать в спецификации <a href="http://json-schema.org/latest/json-schema-validation.html">здесь</a>.

View File

@ -32,8 +32,8 @@
<dt>payload<span class="property-type">объект | строка</span></dt> <dt>payload<span class="property-type">объект | строка</span></dt>
<dd> <dd>
<ul> <ul>
<li>Если вход является значением строкового типа, узел пытается проанализировать ее как XML и создает объект JavaScript.</li> <li>Если на входе значение строкового типа, узел пытается проанализировать его как XML и создает объект JavaScript.</li>
<li>Если вход является JavaScript объектом, узел пытается построить XML-строку.</li> <li>Если на входе JavaScript объект, узел пытается построить XML-строку.</li>
</ul> </ul>
</dd> </dd>
</dl> </dl>

View File

@ -30,8 +30,8 @@
<dt>payload<span class="property-type">объект | строка</span></dt> <dt>payload<span class="property-type">объект | строка</span></dt>
<dd> <dd>
<ul> <ul>
<li>Если вход является YAML-строкой, узел пытается проанализировать ее как JavaScript объект.</li> <li>Если на входе YAML-строка, узел пытается проанализировать ее как JavaScript объект.</li>
<li>Если вход является JavaScript объектом, узел создает YAML-строку.</li> <li>Если на входе JavaScript объект, узел создает YAML-строку.</li>
</ul> </ul>
</dd> </dd>
</dl> </dl>

View File

@ -24,7 +24,7 @@
<dt>payload<span class="property-type">объект | строка | массив | буфер</span></dt> <dt>payload<span class="property-type">объект | строка | массив | буфер</span></dt>
<dd>Поведение узла определяется типом <code>msg.payload</code>: <dd>Поведение узла определяется типом <code>msg.payload</code>:
<ul> <ul>
<li><b>строка</b>/<b>буфер</b> - сообщение разделяется с помощью указанного символа (по умолчанию: <code>\n</code>), последовательности буфера или фиксированной длины.</li> <li><b>строка</b>/<b>буфер</b> - сообщение разделяется с помощью указанного символа (по умолчанию: <code>\n</code>), последовательности буфера или по фиксированной длине.</li>
<li><b>массив</b> - сообщение разбивается на отдельные элементы массива или массивы фиксированной длины.</li> <li><b>массив</b> - сообщение разбивается на отдельные элементы массива или массивы фиксированной длины.</li>
<li><b>объект</b> - сообщение отправляется для каждой пары ключ/значение объекта.</li> <li><b>объект</b> - сообщение отправляется для каждой пары ключ/значение объекта.</li>
</ul> </ul>
@ -34,7 +34,7 @@
<h3>Выводит</h3> <h3>Выводит</h3>
<dl class="message-properties"> <dl class="message-properties">
<dt>parts<span class="property-type">объект</span></dt> <dt>parts<span class="property-type">объект</span></dt>
<dd>Это свойство содержит информацию о том, как сообщение было отделено от исходного сообщения. При передаче на узел <b>join</b> последовательность может быть собрана в одно сообщение. Свойство имеет следующие свойства: <dd>Это свойство содержит информацию о том, как сообщение было отделено от исходного сообщения. При передаче на узел <b>join</b> последовательность может быть собрана обратно в одно сообщение. Объект содержит следующие свойства:
<ul> <ul>
<li><code>id</code> - идентификатор группы сообщений</li> <li><code>id</code> - идентификатор группы сообщений</li>
<li><code>index</code> - позиция в группе</li> <li><code>index</code> - позиция в группе</li>
@ -49,7 +49,7 @@
<h3>Подробности</h3> <h3>Подробности</h3>
<p> <p>
Этот узел облегчает создание потока, который выполняет общие действия над последовательностью сообщений, перед тем как с помощью узла <b>join</b> объединить последовательность в одно сообщение. Этот узел облегчает создание потока, который выполняет общие действия над последовательностью сообщений, перед тем как с помощью узла <b>join</b> объединить последовательность обратно в одно сообщение.
</p> </p>
<p> <p>
Он использует свойство <code>msg.parts</code> для отслеживания отдельных частей последовательности. Он использует свойство <code>msg.parts</code> для отслеживания отдельных частей последовательности.
@ -60,7 +60,7 @@
Узел также может использоваться для переформатирования потока сообщений. Например, последовательное устройство, которое отправляет завершенные новой строкой команды, может доставлять одно сообщение с частичной командой в конце. В 'потоковом режиме' этот узел будет разбивать сообщение и отправлять каждый завершенный сегмент. Если в конце есть частичный сегмент, узел удержит его и добавит к следующему полученному сообщению. Узел также может использоваться для переформатирования потока сообщений. Например, последовательное устройство, которое отправляет завершенные новой строкой команды, может доставлять одно сообщение с частичной командой в конце. В 'потоковом режиме' этот узел будет разбивать сообщение и отправлять каждый завершенный сегмент. Если в конце есть частичный сегмент, узел удержит его и добавит к следующему полученному сообщению.
</p> </p>
<p> <p>
При работе в этом режиме узел не будет устанавливать свойство <code>msg.parts.count</code>, так как он не знает, сколько сообщений ожидать в потоке. Это означает, что его нельзя использовать с узлом <b>join</b> в его автоматическом режиме. При работе в этом режиме узел не будет устанавливать свойство <code>msg.parts.count</code>, так как он не знает, сколько сообщений ожидать в потоке. Это означает, что его нельзя использовать вместе с узлом <b>join</b> в его автоматическом режиме.
</p> </p>
</script> </script>
@ -73,7 +73,7 @@
</p> </p>
<dl> <dl>
<dt>автоматический</dt> <dt>автоматический</dt>
<dd>При использовании с узлом <b>split</b> он автоматически объединит сообщения, чтобы отменить выполненное разделение.</dd> <dd>При использовании с узлом <b>split</b> он автоматически объединит сообщения, чтобы восстановить структуру сообщения, которая была до разделения.</dd>
<dt>ручной</dt> <dt>ручной</dt>
<dd>Объединяет последовательности сообщений различными способами.</dd> <dd>Объединяет последовательности сообщений различными способами.</dd>
<dt>агрегация последовательности</dt> <dt>агрегация последовательности</dt>
@ -103,7 +103,7 @@
<h3>Подробности</h3> <h3>Подробности</h3>
<h4>Автоматический режим</h4> <h4>Автоматический режим</h4>
<p> <p>
В автоматическом режиме используется свойство <code>parts</code> входящих сообщений, чтобы определить способ объединения последовательности. Это позволяет автоматически отменять действие узла <b>split</b>. В автоматическом режиме используется свойство <code>parts</code> входящих сообщений, чтобы определить способ объединения последовательности. Это позволяет автоматически выполнять обратное действие для узла <b>split</b>.
</p> </p>
<h4>Ручной режим</h4> <h4>Ручной режим</h4>
@ -123,7 +123,7 @@
Свойство <i>кол-во</i> может быть установлено для количества сообщений, которое должно быть получено перед генерацией выходного сообщения. Для выходных данных объекта, когда это число достигнуто, узел может быть настроен на отправку сообщения для каждого последующего полученного сообщения. Свойство <i>кол-во</i> может быть установлено для количества сообщений, которое должно быть получено перед генерацией выходного сообщения. Для выходных данных объекта, когда это число достигнуто, узел может быть настроен на отправку сообщения для каждого последующего полученного сообщения.
</p> </p>
<p> <p>
Свойство <i>время (сек)</i> может быть установлено, чтобы инициировать отправку нового сообщения с использованием того, что было получено до сих пор. Свойство <i>время (сек)</i> может быть установлено, чтобы инициировать отправку нового сообщения с использованием всего, что было получено до сих пор.
</p> </p>
<p> <p>
Если сообщение получено с установленным свойством <b>msg.complete</b>, выходное сообщение завершается и отправляется. Это сбрасывает любой подсчет частей. Если сообщение получено с установленным свойством <b>msg.complete</b>, выходное сообщение завершается и отправляется. Это сбрасывает любой подсчет частей.

View File

@ -48,7 +48,7 @@
</ul> </ul>
</p> </p>
<p> <p>
<b>Примечание.</b> Этот узел внутренне хранит сообщения для своей работы. Чтобы предотвратить непредвиденное использование памяти, можно указать максимальное количество хранимых сообщений. По умолчанию количество сообщений не ограничено. <b>Примечание.</b> Этот узел буферизирует сообщения внутри для своей работы. Чтобы предотвратить непредвиденное использование памяти, можно указать максимальное количество хранимых сообщений. По умолчанию количество сообщений не ограничено.
<ul> <ul>
<li>Свойство <code>nodeMessageBufferMaxLength</code> устанавливается в <b>settings.js</b>.</li> <li>Свойство <code>nodeMessageBufferMaxLength</code> устанавливается в <b>settings.js</b>.</li>
</ul> </ul>

View File

@ -37,7 +37,7 @@
<h4>Хранение сообщений</h4> <h4>Хранение сообщений</h4>
<p> <p>
Этот узел будет буферизировать сообщения внутри, чтобы работать между последовательностями. Параметр <code>nodeMessageBufferMaxLength</code> можно использовать для ограничения количества сообщений, которые узел будут буферизовать. Этот узел будет буферизировать сообщения внутри, чтобы работать с последовательностями. Параметр <code>nodeMessageBufferMaxLength</code> можно использовать для ограничения количества сообщений, которые узел будут буферизовать.
</p> </p>
<p> <p>
Если сообщение получено с установленным свойством <b>msg.reset</b>, буферизованные сообщения удаляются и не отправляются. Если сообщение получено с установленным свойством <b>msg.reset</b>, буферизованные сообщения удаляются и не отправляются.

View File

@ -16,7 +16,7 @@
<script type="text/html" data-help-name="file"> <script type="text/html" data-help-name="file">
<p> <p>
Записывает <code>msg.payload</code> в файл, либо добавляя в конец, либо заменяя существующий контент. Кроме того, он может удалить файл. Записывает <code>msg.payload</code> в файл, либо добавлением в конец, либо заменой существующего контента. Кроме того, им можно удалять файл.
</p> </p>
<h3>Принимает</h3> <h3>Принимает</h3>
@ -38,7 +38,7 @@
Если используется <code>msg.filename</code>, файл будет закрыт после каждой записи. Для лучшей производительности используйте фиксированное имя файла. Если используется <code>msg.filename</code>, файл будет закрыт после каждой записи. Для лучшей производительности используйте фиксированное имя файла.
</p> </p>
<p> <p>
Он может быть настроен на перезапись всего файла, а не на добавление. Например, при записи двоичных данных в файл, например изображение, следует использовать эту опцию и отключить опцию добавления новой строки. Он может быть настроен на перезапись всего файла, а не на добавление. Например, при записи двоичных данных (типа изображения) в файл, следует использовать эту опцию и отключить опцию добавления новой строки.
</p> </p>
<p> <p>
Кодировка данных, записанных в файл, может быть выбрана в списке кодировок. Кодировка данных, записанных в файл, может быть выбрана в списке кодировок.
@ -50,13 +50,13 @@
<script type="text/html" data-help-name="file in"> <script type="text/html" data-help-name="file in">
<p> <p>
Читает содержимое файла как строковый тип или двоичный буфер. Читает содержимое файла как строку или двоичный буфер.
</p> </p>
<h3>Принимает</h3> <h3>Принимает</h3>
<dl class="message-properties"> <dl class="message-properties">
<dt class="optional">filename <span class="property-type">строка</span></dt> <dt class="optional">filename <span class="property-type">строка</span></dt>
<dd>если не задано в конфигурации узла, это свойство устанавливает имя файла для чтения.</dd> <dd>это свойство устанавливает имя файла для чтения, если оно не задано в настройках узла.</dd>
</dl> </dl>
<h3>Выводит</h3> <h3>Выводит</h3>
@ -69,13 +69,13 @@
<h3>Подробности</h3> <h3>Подробности</h3>
<p> <p>
Имя файла должно быть абсолютным путем, иначе оно будет относительно рабочего каталога процесса Node-RED. Имя файла должно быть абсолютным путем к файлу, иначе оно будет путем относительно рабочего каталога процесса Node-RED.
</p> </p>
<p> <p>
В Windows может быть необходимо кодировать разделители пути двойной косой чертой, например: <code>\\Users\\myUser</code>. В Windows может быть необходимо кодировать разделители пути двойной косой чертой, например: <code>\\Users\\myUser</code>.
</p> </p>
<p> <p>
При желании текстовый файл можно разбить на строки, выводя по одному сообщению на строку, или двоичный файл разбить на более мелкие фрагменты буфера - размер блока зависит от операционной системы, но обычно составляет 64 КБ (Linux/Mac) или 41 КБ (Windows). При желании текстовый файл можно разбить на строки, выводя по одному сообщению для каждой строки, или двоичный файл разбить на более мелкие фрагменты буфера - размер блока зависит от операционной системы, но обычно составляет 64 КБ (Linux/Mac) или 41 КБ (Windows).
</p> </p>
<p> <p>
При разбиении на несколько сообщений каждое сообщение будет иметь свойство <code>parts</code>, формирующее полную последовательность сообщений. При разбиении на несколько сообщений каждое сообщение будет иметь свойство <code>parts</code>, формирующее полную последовательность сообщений.

View File

@ -16,13 +16,13 @@
<script type="text/html" data-help-name="watch"> <script type="text/html" data-help-name="watch">
<p> <p>
Наблюдает за изменениями каталога или файла. Наблюдает за изменениями директории или файла.
</p> </p>
<p> <p>
Вы можете ввести список разделенных запятыми каталогов и/или файлов. Вам нужно взять в кавычки "..." те из них, в которых есть пробелы. Вы можете ввести список разделенных запятыми директорий и/или файлов. Вам нужно взять в кавычки "..." те из них, в которых есть пробелы.
</p> </p>
<p> <p>
В Windows Вы должны использовать двойную обратную косую черту \\ в любых именах каталогов. В Windows вы должны использовать двойную обратную косую черту \\ вместо одной в именах директорий.
</p> </p>
<p> <p>
Полное имя фактически измененного файла помещается в <code>msg.payload</code> и <code>msg.filename</code>, а строковая версия списка наблюдения возвращается в <code>msg.topic</code>. Полное имя фактически измененного файла помещается в <code>msg.payload</code> и <code>msg.filename</code>, а строковая версия списка наблюдения возвращается в <code>msg.topic</code>.
@ -31,9 +31,9 @@
<code>msg.file</code> содержит только краткое имя файла, который изменился. <code>msg.type</code> содержит тип измененной единицы, обычно это <i>file</i> для файла или <i>directory</i> для директории, тогда как <code>msg.size</code> содержит размер файла в байтах. <code>msg.file</code> содержит только краткое имя файла, который изменился. <code>msg.type</code> содержит тип измененной единицы, обычно это <i>file</i> для файла или <i>directory</i> для директории, тогда как <code>msg.size</code> содержит размер файла в байтах.
</p> </p>
<p> <p>
В Linux <i>все</i> является файлом, и может быть под наблюдением... В Linux <i>все</i> является файлами, и может быть под наблюдением...
</p> </p>
<p> <p>
<b>Примечание.</b> Наблюдаемые каталог или файл должны существовать. Если файл или каталог будет удален, они могут перестать отслеживаться, даже если они будут созданы заново. <b>Примечание.</b> Наблюдаемые директория или файл должны существовать. Если файл или директория будут удалены, они могут перестать отслеживаться, даже если они затем будут созданы заново.
</p> </p>
</script> </script>

View File

@ -27,17 +27,19 @@ async function getFlowsFromPath(path) {
var validFiles = []; var validFiles = [];
return fs.readdir(path).then(files => { return fs.readdir(path).then(files => {
var promises = []; var promises = [];
files.forEach(function(file) { if (files) {
var fullPath = fspath.join(path,file); files.forEach(function(file) {
var stats = fs.lstatSync(fullPath); var fullPath = fspath.join(path,file);
if (stats.isDirectory()) { var stats = fs.lstatSync(fullPath);
validFiles.push(file); if (stats.isDirectory()) {
promises.push(getFlowsFromPath(fullPath)); validFiles.push(file);
} else if (/\.json$/.test(file)){ promises.push(getFlowsFromPath(fullPath));
validFiles.push(file); } else if (/\.json$/.test(file)){
promises.push(Promise.resolve(file.split(".")[0])) validFiles.push(file);
} promises.push(Promise.resolve(file.split(".")[0]))
}) }
})
}
return Promise.all(promises) return Promise.all(promises)
}).then(results => { }).then(results => {
results.forEach(function(r,i) { results.forEach(function(r,i) {

View File

@ -94,6 +94,10 @@ var api = module.exports = {
getNodeConfig: async function(opts) { getNodeConfig: async function(opts) {
var id = opts.id; var id = opts.id;
var lang = opts.lang; var lang = opts.lang;
if (/[^a-z\-\*]/i.test(opts.lang)) {
reject(new Error("Invalid language: "+opts.lang));
return
}
var result = runtime.nodes.getNodeConfig(id,lang); var result = runtime.nodes.getNodeConfig(id,lang);
if (result) { if (result) {
runtime.log.audit({event: "nodes.config.get",id:id}, opts.req); runtime.log.audit({event: "nodes.config.get",id:id}, opts.req);
@ -116,6 +120,10 @@ var api = module.exports = {
* @memberof @node-red/runtime_nodes * @memberof @node-red/runtime_nodes
*/ */
getNodeConfigs: async function(opts) { getNodeConfigs: async function(opts) {
if (/[^a-z\-\*]/i.test(opts.lang)) {
reject(new Error("Invalid language: "+opts.lang));
return
}
runtime.log.audit({event: "nodes.configs.get"}, opts.req); runtime.log.audit({event: "nodes.configs.get"}, opts.req);
return runtime.nodes.getNodeConfigs(opts.lang); return runtime.nodes.getNodeConfigs(opts.lang);
}, },
@ -374,6 +382,10 @@ var api = module.exports = {
getModuleCatalogs: async function(opts) { getModuleCatalogs: async function(opts) {
var namespace = opts.module; var namespace = opts.module;
var lang = opts.lang; var lang = opts.lang;
if (/[^a-z\-\*]/i.test(lang)) {
reject(new Error("Invalid language: "+lang));
return
}
var prevLang = runtime.i18n.i.language; var prevLang = runtime.i18n.i.language;
// Trigger a load from disk of the language if it is not the default // Trigger a load from disk of the language if it is not the default
return new Promise( (resolve,reject) => { return new Promise( (resolve,reject) => {
@ -404,6 +416,10 @@ var api = module.exports = {
getModuleCatalog: async function(opts) { getModuleCatalog: async function(opts) {
var namespace = opts.module; var namespace = opts.module;
var lang = opts.lang; var lang = opts.lang;
if (/[^a-z\-\*]/i.test(lang)) {
reject(new Error("Invalid language: "+lang));
return
}
var prevLang = runtime.i18n.i.language; var prevLang = runtime.i18n.i.language;
// Trigger a load from disk of the language if it is not the default // Trigger a load from disk of the language if it is not the default
return new Promise(resolve => { return new Promise(resolve => {

View File

@ -23,7 +23,7 @@
var i18n = require("i18next"); var i18n = require("i18next");
var path = require("path"); var path = require("path");
var fs = require("fs"); var fs = require("fs-extra");
var defaultLang = "en-US"; var defaultLang = "en-US";
@ -81,36 +81,28 @@ function mergeCatalog(fallback,catalog) {
} }
function readFile(lng, ns) { async function readFile(lng, ns) {
return new Promise((resolve, reject) => { if (/[^a-z\-]/i.test(lng)) {
if (resourceCache[ns] && resourceCache[ns][lng]) { throw new Error("Invalid language: "+lng)
resolve(resourceCache[ns][lng]); }
} else if (resourceMap[ns]) { if (resourceCache[ns] && resourceCache[ns][lng]) {
var file = path.join(resourceMap[ns].basedir, lng, resourceMap[ns].file); return resourceCache[ns][lng];
fs.readFile(file, "utf8", function (err, content) { } else if (resourceMap[ns]) {
if (err) { const file = path.join(resourceMap[ns].basedir, lng, resourceMap[ns].file);
reject(err); const content = await fs.readFile(file, "utf8");
} else { resourceCache[ns] = resourceCache[ns] || {};
try { resourceCache[ns][lng] = JSON.parse(content.replace(/^\uFEFF/, ''));
resourceCache[ns] = resourceCache[ns] || {}; var baseLng = lng.split('-')[0];
resourceCache[ns][lng] = JSON.parse(content.replace(/^\uFEFF/, '')); if (baseLng !== lng && resourceCache[ns][baseLng]) {
var baseLng = lng.split('-')[0]; mergeCatalog(resourceCache[ns][baseLng], resourceCache[ns][lng]);
if (baseLng !== lng && resourceCache[ns][baseLng]) {
mergeCatalog(resourceCache[ns][baseLng], resourceCache[ns][lng]);
}
if (lng !== defaultLang) {
mergeCatalog(resourceCache[ns][defaultLang], resourceCache[ns][lng]);
}
resolve(resourceCache[ns][lng]);
} catch (e) {
reject(e);
}
}
});
} else {
reject(new Error("Unrecognised namespace"));
} }
}); if (lng !== defaultLang) {
mergeCatalog(resourceCache[ns][defaultLang], resourceCache[ns][lng]);
}
return resourceCache[ns][lng];
} else {
throw new Error("Unrecognised namespace");
}
} }
var MessageFileLoader = { var MessageFileLoader = {
@ -181,6 +173,10 @@ function init(settings) {
function getCatalog(namespace,lang) { function getCatalog(namespace,lang) {
var result = null; var result = null;
lang = lang || defaultLang; lang = lang || defaultLang;
if (/[^a-z\-]/i.test(lang)) {
throw new Error("Invalid language: "+lng)
}
if (resourceCache.hasOwnProperty(namespace)) { if (resourceCache.hasOwnProperty(namespace)) {
result = resourceCache[namespace][lang]; result = resourceCache[namespace][lang];
if (!result) { if (!result) {

View File

@ -1759,13 +1759,13 @@ describe('JOIN node', function() {
{ msg: {seq:0, payload:"A", parts:{id:1, type:"string", ch:",", index:0, count:3}}, delay:0, avr:500, var:100}, { msg: {seq:0, payload:"A", parts:{id:1, type:"string", ch:",", index:0, count:3}}, delay:0, avr:500, var:100},
{ msg: {seq:1, payload:"B", parts:{id:1, type:"string", ch:",", index:1, count:3}}, delay:200, avr:500, var:100}, { msg: {seq:1, payload:"B", parts:{id:1, type:"string", ch:",", index:1, count:3}}, delay:200, avr:500, var:100},
{ msg: {seq:2, payload:"dummy", reset: true, parts:{id:1}}, delay:500, avr:500, var:100} { msg: {seq:2, payload:"dummy", reset: true, parts:{id:1}}, delay:500, avr:500, var:100}
]); ]);
}); });
it('should call done() when timed out', function (done) { it('should call done() when timed out', function (done) {
mapiDoneJoinTestHelper(done, {mode:"custom", joiner:",", build:"string", timeout:0.5}, [ mapiDoneJoinTestHelper(done, {mode:"custom", joiner:",", build:"string", timeout:0.5}, [
{ msg: {seq:0, payload:"A"}, delay:0, avr:500, var:100}, { msg: {seq:0, payload:"A"}, delay:0, avr:500, var:100},
{ msg: {seq:1, payload:"B"}, delay:200, avr:500, var:100}, { msg: {seq:1, payload:"B"}, delay:200, avr:500, var:100},
]); ]);
}); });
it('should call done() when all messages are reduced', function (done) { it('should call done() when all messages are reduced', function (done) {
mapiDoneJoinTestHelper(done, {mode:"reduce", reduceRight:false, reduceExp:"$A+payload", reduceInit:"0", mapiDoneJoinTestHelper(done, {mode:"reduce", reduceRight:false, reduceExp:"$A+payload", reduceInit:"0",
@ -1785,4 +1785,40 @@ describe('JOIN node', function() {
]); ]);
}); });
}); });
it('should handle msg.parts even if messages are out of order in auto mode if exactly one message has count set', function (done) {
var flow = [{ id: "n1", type: "join", wires: [["n2"]], mode: "auto" },
{ id: "n2", type: "helper" }];
helper.load(joinNode, flow, function () {
var n1 = helper.getNode("n1");
var n2 = helper.getNode("n2");
n2.on("input", function (msg) {
msg.payload.length.should.be.eql(5);
msg.payload.should.be.eql([0,1,2,3,4]);
done();
});
var msg = {};
msg.parts = {
id: RED.util.generateId()
};
for(var elem = 1; elem < 5; ++elem) {
var _msg = RED.util.cloneMessage(msg);
_msg.parts.index = elem;
if(elem == 4) {
_msg.parts.count = 5;
}
_msg.payload = elem;
n1.receive(_msg);
}
var _msg = RED.util.cloneMessage(msg);
delete _msg.parts.count;
_msg.parts.index = 0;
_msg.payload = 0;
n1.receive(_msg);
});
})
}); });