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-to-markdown": "5.0.0",
"grunt-jsonlint": "2.1.3",
"grunt-mkdir": "~1.0.0",
"grunt-mkdir": "~1.1.0",
"grunt-npm-command": "~0.1.2",
"grunt-sass": "~3.1.0",
"grunt-simple-mocha": "~0.4.1",

View File

@ -39,9 +39,12 @@ module.exports = {
},
get: function(req,res) {
var namespace = req.params[0];
var lngs = req.query.lng;
namespace = namespace.replace(/\.json$/,"");
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;
// Trigger a load from disk of the language if it is not the default
i18n.i.changeLanguage(lang, function(){

View File

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

View File

@ -401,7 +401,8 @@ RED.palette = (function() {
RED.workspaces.show(nt.substring(8));
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);

View File

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

View File

@ -737,7 +737,10 @@ module.exports = function(RED) {
group.msg = Object.assign(group.msg, msg);
group.send = send;
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')) {
completeSend(partId);
}
@ -759,3 +762,4 @@ module.exports = function(RED) {
}
RED.nodes.registerType("join",JoinNode);
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -19,7 +19,7 @@
Устанавливает, изменяет, удаляет или перемещает свойства сообщения, контекста потока или глобального контекста.
</p>
<p>
В узле можно указать несколько правил, которые будут применяться в том порядке, в котором они определены.
В узле можно указать несколько операций, которые будут применяться в том порядке, в котором они заданы.
</p>
<h3>Подробности</h3>
@ -28,13 +28,13 @@
</p>
<dl class="message-properties">
<dt>Установить</dt>
<dd>установить свойство. Значение может быть разных типов или может быть взято из существующего свойства сообщения или контекста.</dd>
<dd>устанавливает свойство. Значение может быть различных типов или может быть взято из существующего свойства сообщения или контекста.</dd>
<dt>Изменить</dt>
<dd>найти &amp; заменить части свойства. Если используется регулярное выражение, настройка &quot;заменить на&quot; может включать группы захвата, например <code>$1</code>. При полном совпадении заменяет только тип.</dd>
<dd>ищет и заменяет части текста в свойстве сообщения. Если используется регулярное выражение, настройка &quot;заменить на&quot; может включать группы захвата, например <code>$1</code>. При полном совпадении заменяет только тип.</dd>
<dt>Удалить</dt>
<dd>удалить свойство.</dd>
<dd>удаляет свойство.</dd>
<dt>Переместить</dt>
<dd>переместить или переименовать свойство.</dd>
<dd>перемещает или переименовывает свойство.</dd>
</dl>
<p>
Тип свойства &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">
<p>
Соотносит значение одного числового диапазона к другому числовому диапазону.
Соотносит значение одного числового диапазона с другим числовым диапазоном.
</p>
<h3>Принимает</h3>
@ -28,7 +28,7 @@
<h3>Выводит</h3>
<dl class="message-properties">
<dt>payload <span class="property-type">число</span></dt>
<dd>Значение, соотнесенное к новому диапазону.</dd>
<dd>Значение, соотнесенное с новым диапазоном.</dd>
</dl>
<h3>Подробности</h3>
@ -42,7 +42,7 @@
<i>Масштабировать и обернуть в целевой диапазон</i> означает, что результат будет обернут вокруг целевого диапазона:
</p>
<p>
Например, для входа 0 - 10 сопоставленного с 0 - 100.
Например, если входные 0 - 10 сопоставляются с 0 - 100:
</p>
<table style="outline-width:#888 solid thin">
<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">
<p>
Устанавливает свойство на основе предоставленного шаблона.
Генерирует текст по установленному шаблону и присваивает его выбранному свойству сообщения.
</p>
<h3>Принимает</h3>
@ -24,23 +24,23 @@
<dt>msg <span class="property-type">объект</span></dt>
<dd>Объект сообщения msg, содержащий информацию для заполнения шаблона.</dd>
<dt class="optional">шаблон <span class="property-type">строка</span></dt>
<dd>Шаблон для заполнения данными из сообщения msg. Если шаблон не настроен на панели редактирования, тогда он может быть установлен через свойство msg.template.</dd>
<dd>Шаблон текста для заполнения данными из сообщения msg. Если шаблон не введен на панели редактирования, тогда он может быть установлен через свойство msg.template.</dd>
</dl>
<h3>Выводит</h3>
<dl class="message-properties">
<dt>msg <span class="property-type">объект</span></dt>
<dd>Сообщение msg, у которого выбранному свойству присвоено значение, сформированное заполнением шаблона свойствами из входящего сообщения.</dd>
<dd>Сообщение msg, у которого выбранному свойству присвоено тексктовое значение, полученное после заполнения шаблона данными входящего сообщения.</dd>
</dl>
<h3>Подробности</h3>
<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>
<pre>Привет, {{payload.name}}. Сегодня {{date}}</pre>
<pre>Привет, {{payload.name}}. Сегодня {{date}}.</pre>
<p>
получает сообщение msg, содержащее:
</p>
@ -51,13 +51,13 @@
}
}</pre>
<p>
Результирующее свойство будет:
Выбранному свойству будет присвоен текст:
</p>
<pre>Привет, Иван. Сегодня понедельник</pre>
<pre>Привет, Иван. Сегодня понедельник.</pre>
<p>
Можно использовать свойство из контекста потока или глобального контекста. Просто используйте <code>{{flow.name}}</code> или <code>{{global.name}}</code>, или для постоянного хранилища <code>store</code> используйте <code>{{flow[store].name}}</code> или <code>{{global[store].name}}</code>.
</p>
<p>
<b>Примечание:</b> по умолчанию <i>mustache</i> кодирует любые не алфавитно-цифровых или HTML-сущности в значениях, которые он подставляет, для безопасного использования в HTML. Чтобы предотвратить это, используйте тройные фигурные скобки <code>{{{triple}}}</code>.
<b>Примечание:</b> по умолчанию <i>mustache</i> заменяет определенные символы их escape-кодами для безопасного использования в HTML. Чтобы это не происходило, вы можете использовать тройные фигурные скобки <code>{{{triple}}}</code>.
</p>
</script>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -32,7 +32,7 @@
<dt class="optional">payload</dt>
<dd>Отправляется как тело запроса.</dd>
<dt class="optional">rejectUnauthorized</dt>
<dd>Если установлено значение <code>false</code>, разрешает отправлять запросы на сайты https, которые используют самозаверяющие сертификаты.</dd>
<dd>Если установлено значение <code>false</code>, разрешает отправлять запросы на сайты https, которые используют самозаверенные сертификаты.</dd>
<dt class="optional">followRedirects</dt>
<dd>Если установлено значение <code>false</code>, запрещает переадресацию (HTTP 301). По умолчанию <code>true</code>.</dd>
<dt class="optional">requestTimeout</dt>
@ -68,20 +68,20 @@
<h4>Использование нескольких узлов HTTP-запросов</h4>
<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>
<h4>Обработка куки</h4>
<p>
Свойство <code>cookies</code>, передаваемое узлу, должно быть объектом пар имя/значение. Значением может быть либо строка для установки значения куки, либо это может быть объект с единственным свойством <code>value</code>.
Свойство <code>cookies</code>, передаваемое узлу, должно быть объектом из пар имя/значение. Значением может быть либо строка для установки значения куки, либо это может быть объект с единственным свойством <code>value</code>.
</p>
<p>
Все куки, возвращаемые запросом, передаются обратно в свойство <code>responseCookies</code>.
Все куки, возвращаемые запросом, передаются обратно в свойстве <code>responseCookies</code>.
</p>
<h4>Обработка типов контента</h4>
<p>
Если <code>msg.payload</code> является объектом, узел автоматически установит тип содержимого запроса в <code>application/json</code> и закодирует тело как таковое.
Если <code>msg.payload</code> является объектом, узел автоматически установит тип содержимого запроса в <code>application/json</code> и закодирует тело соответствующим образом.
</p>
<p>
Чтобы закодировать запрос как данные формы, для <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">
<p>
Входной узел WebSocket.
Входящий узел WebSocket.
</p>
<p>
По умолчанию данные, полученные из WebSocket, будут в <code>msg.payload</code>. Сокет можно настроить так, чтобы он ожидал правильно сформированную строку JSON. В этом случае он будет анализировать JSON и отправлять полученный объект как полное сообщение.
@ -25,17 +25,17 @@
<script type="text/html" data-help-name="websocket out">
<p>
Выходной узел WebSocket.
Исходящий узел WebSocket.
</p>
<p>
По умолчанию <code>msg.payload</code> будет отправлено через WebSocket. Сокет может быть сконфигурирован для кодирования всего объекта <code>msg</code> в виде строки JSON и отправки его через WebSocket.
</p>
<p>
Если сообщение, поступающее на этот узел, началось с узла WebSocket In, сообщение будет отправлено обратно клиенту, который запустил поток. В противном случае сообщение будет передано всем подключенным клиентам.
Если сообщение, поступающее на этот узел, было начато в потоке узлом WebSocket In, сообщение будет отправлено обратно клиенту, который запустил поток. В противном случае сообщение будет передано всем подключенным клиентам.
</p>
<p>
Если Вы хотите передать сообщение, которое началось на узле WebSocket In, всем подключенным клиентам, тогда Вы должны удалить свойство <code>msg._session</code> в потоке.
Если Вы хотите передать сообщение, которое началось с узла WebSocket In, всем подключенным клиентам, тогда вам нужно удалить свойство <code>msg._session</code> перед тем как передавать его этому узлу.
</p>
</script>

View File

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

View File

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

View File

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

View File

@ -37,7 +37,7 @@
</ul>
</dd>
<dt>schemaError<span class="property-type">массив</span></dt>
<dd>Если проверка JSON-схемы завершится неудачно, узел catch будет иметь свойство <code>schemaError</code>, содержащее массив ошибок.</dd>
<dd>Если проверка JSON-схемы завершится неудачно, узлом catch можно получить свойство <code>schemaError</code>, содержащее массив ошибок.</dd>
</dl>
<h3>Подробности</h3>
@ -45,10 +45,10 @@
По умолчанию узел работает с <code>msg.payload</code>, но его можно настроить для преобразования любого свойства сообщения.
</p>
<p>
Узел также может быть сконфигурирован для обеспечения конкретной кодировки вместо переключения между ними. Это можно использовать, например, с узлом <code>HTTP In</code>, чтобы гарантировать, что данные payload являются объектом, даже если входящий запрос неправильно установил свой тип содержимого для узла HTTP In, чтобы выполнить преобразование.
Узел также может быть сконфигурирован для обеспечения конкретной кодировки вместо переключения между ними. Это можно использовать, например, при работе с узлом <code>HTTP In</code>, чтобы гарантировать, что данные payload всегда будут являться объектом, даже если входящий запрос неправильно установил свой тип содержимого для узла HTTP In, чтобы выполнить преобразование.
</p>
<p>
Если узел настроен на то, чтобы свойство кодировалось как строка, и он получает строку, дальнейшие проверки этого свойства выполняться не будут. Он не будет проверять, является ли строка допустимым JSON, и не будет переформатировать ее, если выбрана опция форматирования.
Если узел настроен так, чтобы свойство кодировалось как строка, и он получает строку, дальнейшие проверки этого свойства выполняться не будут. Он не будет проверять, является ли строка допустимым JSON, и не будет переформатировать ее, если выбрана опция форматирования.
</p>
<p>
Подробнее о 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>
<dd>
<ul>
<li>Если вход является значением строкового типа, узел пытается проанализировать ее как XML и создает объект JavaScript.</li>
<li>Если вход является JavaScript объектом, узел пытается построить XML-строку.</li>
<li>Если на входе значение строкового типа, узел пытается проанализировать его как XML и создает объект JavaScript.</li>
<li>Если на входе JavaScript объект, узел пытается построить XML-строку.</li>
</ul>
</dd>
</dl>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -16,13 +16,13 @@
<script type="text/html" data-help-name="watch">
<p>
Наблюдает за изменениями каталога или файла.
Наблюдает за изменениями директории или файла.
</p>
<p>
Вы можете ввести список разделенных запятыми каталогов и/или файлов. Вам нужно взять в кавычки "..." те из них, в которых есть пробелы.
Вы можете ввести список разделенных запятыми директорий и/или файлов. Вам нужно взять в кавычки "..." те из них, в которых есть пробелы.
</p>
<p>
В Windows Вы должны использовать двойную обратную косую черту \\ в любых именах каталогов.
В Windows вы должны использовать двойную обратную косую черту \\ вместо одной в именах директорий.
</p>
<p>
Полное имя фактически измененного файла помещается в <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> содержит размер файла в байтах.
</p>
<p>
В Linux <i>все</i> является файлом, и может быть под наблюдением...
В Linux <i>все</i> является файлами, и может быть под наблюдением...
</p>
<p>
<b>Примечание.</b> Наблюдаемые каталог или файл должны существовать. Если файл или каталог будет удален, они могут перестать отслеживаться, даже если они будут созданы заново.
<b>Примечание.</b> Наблюдаемые директория или файл должны существовать. Если файл или директория будут удалены, они могут перестать отслеживаться, даже если они затем будут созданы заново.
</p>
</script>

View File

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

View File

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

View File

@ -23,7 +23,7 @@
var i18n = require("i18next");
var path = require("path");
var fs = require("fs");
var fs = require("fs-extra");
var defaultLang = "en-US";
@ -81,36 +81,28 @@ function mergeCatalog(fallback,catalog) {
}
function readFile(lng, ns) {
return new Promise((resolve, reject) => {
if (resourceCache[ns] && resourceCache[ns][lng]) {
resolve(resourceCache[ns][lng]);
} else if (resourceMap[ns]) {
var file = path.join(resourceMap[ns].basedir, lng, resourceMap[ns].file);
fs.readFile(file, "utf8", function (err, content) {
if (err) {
reject(err);
} else {
try {
resourceCache[ns] = resourceCache[ns] || {};
resourceCache[ns][lng] = JSON.parse(content.replace(/^\uFEFF/, ''));
var baseLng = lng.split('-')[0];
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"));
async function readFile(lng, ns) {
if (/[^a-z\-]/i.test(lng)) {
throw new Error("Invalid language: "+lng)
}
if (resourceCache[ns] && resourceCache[ns][lng]) {
return resourceCache[ns][lng];
} else if (resourceMap[ns]) {
const file = path.join(resourceMap[ns].basedir, lng, resourceMap[ns].file);
const content = await fs.readFile(file, "utf8");
resourceCache[ns] = resourceCache[ns] || {};
resourceCache[ns][lng] = JSON.parse(content.replace(/^\uFEFF/, ''));
var baseLng = lng.split('-')[0];
if (baseLng !== lng && resourceCache[ns][baseLng]) {
mergeCatalog(resourceCache[ns][baseLng], resourceCache[ns][lng]);
}
});
if (lng !== defaultLang) {
mergeCatalog(resourceCache[ns][defaultLang], resourceCache[ns][lng]);
}
return resourceCache[ns][lng];
} else {
throw new Error("Unrecognised namespace");
}
}
var MessageFileLoader = {
@ -181,6 +173,10 @@ function init(settings) {
function getCatalog(namespace,lang) {
var result = null;
lang = lang || defaultLang;
if (/[^a-z\-]/i.test(lang)) {
throw new Error("Invalid language: "+lng)
}
if (resourceCache.hasOwnProperty(namespace)) {
result = resourceCache[namespace][lang];
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: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}
]);
]);
});
it('should call done() when timed out', function (done) {
mapiDoneJoinTestHelper(done, {mode:"custom", joiner:",", build:"string", timeout:0.5}, [
{ msg: {seq:0, payload:"A"}, delay:0, 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) {
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);
});
})
});