ДОВІДНИК З NODE-RED українською мовою
Автор: Олександр Пупена
Написати фрагмент програми на Node-RED, який буде:
У даному рішенні використовуються:
/browsefile у вузлі template для формування HTML (опис) з використанням синтаксису Mustachehttp-in (опис) та http-responce (опис) для реалізації HTTP серверуread file для читання файлівcsv для перетворення змісту з формату CSV в об’єкти JS (опис)Зверніть увагу, що для простоти завдання рішення не передбачає фрагментацію списку файлів на кілька сторінок, тому при великій кількості даних буде надто перевантажувати як клієнта так і сервера. Також в задачі не передбачається формування негативних відповідей.
Для перевірки даної роботи необхідні дані що збережені в CSV файлі та посилаються на файли зображень. Для цього рекомендується виконати завдання з відправки даних в Node-RED за допомогою форми.
Про роботу з таблицями в форматі HTML можна почитати за цим посиланням. У загальному формат виведення має бути приблизно таким:

При цьому код HTML буде мати такий формат:
<!DOCTYPE html>
<html>
<head>
<style>
table {font-family: arial, sans-serif;border-collapse: collapse;width: 100%;}
td, th {border: 1px solid #dddddd;text-align: left; padding: 8px;}
tr:nth-child(even) {background-color: #dddddd;}
</style>
</head>
<body>
<h2>Рисунки з бази:</h2>
<table>
<tr>
<th>Опис</th>
<th>Рисунок</th>
</tr>
<tr>
<td>Бріард</td>
<td><img src="https://upload.wikimedia.org/wikipedia/commons/6/60/Briard_fauve.JPG" width="100" height="100"></td>
</tr>
<tr>
<td>Німецька вівчарка</td>
<td><img src="https://upload.wikimedia.org/wikipedia/commons/4/4f/Berger_allemand_en_montagne.jpg" width="100" height="100"></td>
</tr>
</table>
</body>
</html>
Можна спробувати цей код, замінивши його в цьому прикладі.
У нашому випадку необхідно щоб кожен рядок таблиці формувався динамічно в залежності від елементів масиву, в якому буде розміщено текст та посилання на рисунок. Припустимо, що масив буде передаватися як властивість payload, а елементи масиву будуть об’єктами:
{
"description":"Опис рисунку",
"filename":"назваФайлу"
}
У цьому випадку, скористувавшись синтаксису Mustache матимемо наступний шаблон:
<!DOCTYPE html>
<html>
<head>
<style>
table {font-family: arial, sans-serif;border-collapse: collapse;width: 100%;}
td, th {border: 1px solid #dddddd;text-align: left; padding: 8px;}
tr:nth-child(even) {background-color: #dddddd;}
</style>
</head>
<body>
<h2>Рисунки з бази:</h2>
<table>
<tr>
<th>Опис</th>
<th>Рисунок</th>
</tr>
<tr>
<td></td>
<td><img src="/img/" width="100" height="100"></td>
</tr>
</table>
</body>
</html>
Таким чином, через секцію `` буде створено стільки рядків, скільки буде елементів масиву payload, а комірки будуть посилатися на відповідні властивості payload.
Зверніть увагу, що payload.filename очікується назва файлу, до якої добавляється префікс /img/, для того щоб формувати відносний шлях URL до файлу зображення. Тобто якщо payload.filename є рівним 1683744936871horse01-0.png то src="/img/1683744936871horse01-0.png".
Програма в Node-RED включає два потоки:

Перший потік формує HTML зміст на запит сторінки за кінцевою точкою /imgsviev.

Таким чином, набравши на локальному вузлі адресу http://127.0.0.1:1880/imgsviev користувач отримає у відповідь те що надійде на вузол http responce. При надходженні запиту спочатку вузол читання файлу з іменем readcsv завантажує файл зі списком за вказаним в налаштуваннях вузлу шляхом:

Файл який зчитується має наступну структуру:

Як видно, назви файлу містять абсолютний шлях розміщення, задля безпеки видалимо статичну частину шляху і залишимо виключно назву файлу. Для цього скористаємося вбудованою функцією chsnge вузла change , куди передається зміст прочитаного файлу.

Очищений зміст файлу необхідно перетворити з форму CSV в об’єкт, для чого скористуємося вузлом csv з групи parser. У якості назв властивостей вкажемо description та filename, оскільки саме вони задані у шаблоні наступного вузлу. Зверніть увагу на наступне:
semikolon (крапка з комою), але в переліку колонок завжди вказуємо назви через кому
Наступний в потоці стоїть вузол template, який наповнений шаблоном, який наведений в пункті вище:

На виході буде формуватися готова сторінка HTML.
При завантаженні сторінки рендер браузера знаде посилання на файли зображень, на кшталт /img/1683744936871horse01-0.png. Тому він буде формувати запит за цим шляхом, який обробляє другий потік.

Для цього означена кінцева точка в форматі /img/*, що значить приймати усі запити що починаються з /img/:

Далі у вузлі change назва шляху записується в msg.filename, щоб прочитати цей файл. Друга частина URL (після /img/) вказуватиме не назву файлу розміщення, а першу частину, тобто/img/ треба замінити на дійсний шлях розміщення файлів.

Після чого вузол readimg читає запитуваний файл та передає у відповіді.

Експорт потоку доступний за посиланням